fpe2和sp78数据类型?

Iva*_*vic 3 c macos types iokit

我一直在分析在Mac OS X上获得CPU温度和CPU风扇速度所需的代码.有很多例子.这是其中之一:

https://github.com/lavoiesl/osx-cpu-temp

现在,在smc.h文件中定义了一些奇怪的(对我来说)数据类型:

#define DATATYPE_FPE2         "fpe2"

#define DATATYPE_SP78         "sp78"
Run Code Online (Sandbox Code Playgroud)

这些是后来Apple的IOKit在内存中作为返回值写入的数据类型,然后需要将其转换为可用的内容.代码的作者就是这样(请注意,他在评论中写了一个拼写错误的fp78而不是sp78):

// convert fp78 value to temperature
int intValue = (val.bytes[0] * 256 + val.bytes[1]) >> 2;
return intValue / 64.0;
Run Code Online (Sandbox Code Playgroud)

我觉得令人难以置信的是,我无法找到关于这两个代码fpe2sp78的任何注释,旁边是用于访问Mac上的临时和扇形读数的非官方代码示例.

这里有没有人知道如何自己解决这些问题?关于这些代码?!基本上,有人可以指出我有关此的一些文档和/或在这里解释这些数据类型是什么?

Chr*_*ick 8

虽然似乎没有关于这些类型名称的任何"官方"文档,但它们通用性足以弄明白.

FP =浮点,无符号.

SP =浮点数,已签名.

最后两个(十六进制)数字表示整数/分数位.总数告诉我们这个值适合16位.

所以:FPE2=浮点,无符号,14(0xE)位整数,2(0x2)位分数.

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
I  I  I  I  I  I  I  I  I  I  I  I  I  I  F  F
Run Code Online (Sandbox Code Playgroud)

SP值增加了符号位的复杂性.

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
S  I  I  I  I  I  I  I  F  F  F  F  F  F  F  F
Run Code Online (Sandbox Code Playgroud)

要将这些值转换为整数,请丢弃F位(通过移位)并转换为整数类型.注意SP值上的符号位,无论符号是否保留取决于您要移动的类型.

  • 我想指出的是,这些是实数的“固定”点表示。浮点数通常有某种指数,它使整数/小数点向上或向下移动(因此“浮动”)。例如参见/sf/answers/526744151/ (2认同)