Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 浮点数是如何以十六进制表示的?_Ios_Floating Point_Type Conversion_Hex - Fatal编程技术网

Ios 浮点数是如何以十六进制表示的?

Ios 浮点数是如何以十六进制表示的?,ios,floating-point,type-conversion,hex,Ios,Floating Point,Type Conversion,Hex,我正在将数据从iPhone传输到从设备,在那里传输需要16位数据值。现在我有一个需要传输的浮点值,但是我怎么知道它有多大,它是如何用十六进制表示的呢 需要十六进制表示,因为我可能需要切换下半字节和上半字节 在iOS设备上,浮点数与符号位、偏置指数和编码有效位一起存储 对于32位浮点(float),指数为8位,偏移127,编码的有效位为23位。使用64位浮点(double),指数为11位,偏置1023,编码的有效位为52位 下面介绍32位浮点。它来自记忆;我没有仔细检查过。64位浮点数与此类似 考

我正在将数据从iPhone传输到从设备,在那里传输需要16位数据值。现在我有一个需要传输的浮点值,但是我怎么知道它有多大,它是如何用十六进制表示的呢


需要十六进制表示,因为我可能需要切换下半字节和上半字节

在iOS设备上,浮点数与符号位、偏置指数和编码有效位一起存储

对于32位浮点(
float
),指数为8位,偏移127,编码的有效位为23位。使用64位浮点(
double
),指数为11位,偏置1023,编码的有效位为52位

下面介绍32位浮点。它来自记忆;我没有仔细检查过。64位浮点数与此类似

考虑一个float F。用
无符号int E=(并集{float F;无符号int u;}){F}.u。在iOS设备(和许多其他普通计算机)上,E将包含F的编码,即表示它的位

让我们成为
E>>31
。这是标志位。如果F为正(包括+0),则为0;如果F为负(包括-0),则为1

设e为
e>>23&0xff
。这就是有偏指数。无偏(实际)指数为e-127

设f为
E&0x7fffff
。这是编码的有效位。如果0 此编码表示的数字加在一起为(-1)s•2e-127•1.f2。因此,对于编码0x40600000,s为0,e为0x100=128,f为11000000000000002,因此值为(-1)0•2128-127•1.75=1•2•1.75=3.5

有一些特殊情况。如果e为0,则实际有效位为0.f2,而不是1.f2。也就是说,隐式1更改为0。请注意,如果f为零,则表示的值为0。符号仍然有意义,带有浮点零+0和-0的行为略有不同

如果e为255,f为0,则表示的值为无穷大,根据符号的不同为+无穷大或-无穷大

如果e是255,f不是0,则该值是一个具有某种实现定义语义的NaN


要对浮点值进行编码,请确定符号,然后计算两个值中不大于该值大小的最大幂。二的幂等于无偏指数。然后将值除以二的幂,并将其四舍五入以适应有效位,这就得到了有效位。当舍入将有效位推到2(您必须调整指数)时,以及当指数大到足以下溢或小到足以下溢到非规范范围(低于偏置指数为1或更大的范围)时,会出现一些特殊情况。

在iOS设备上,浮点数与符号位一起存储,有偏指数和编码的有效位

对于32位浮点(
float
),指数为8位,偏移127,编码的有效位为23位。使用64位浮点(
double
),指数为11位,偏置1023,编码的有效位为52位

下面介绍32位浮点。它来自记忆;我没有仔细检查过。64位浮点数与此类似

考虑一个float F。用
无符号int E=(并集{float F;无符号int u;}){F}.u。在iOS设备(和许多其他普通计算机)上,E将包含F的编码,即表示它的位

让我们成为
E>>31
。这是标志位。如果F为正(包括+0),则为0;如果F为负(包括-0),则为1

设e为
e>>23&0xff
。这就是有偏指数。无偏(实际)指数为e-127

设f为
E&0x7fffff
。这是编码的有效位。如果0 此编码表示的数字加在一起为(-1)s•2e-127•1.f2。因此,对于编码0x40600000,s为0,e为0x100=128,f为11000000000000002,因此值为(-1)0•2128-127•1.75=1•2•1.75=3.5

有一些特殊情况。如果e为0,则实际有效位为0.f2,而不是1.f2。也就是说,隐式1更改为0。请注意,如果f为零,则表示的值为0。符号仍然有意义,带有浮点零+0和-0的行为略有不同

如果e为255,f为0,则表示的值为无穷大,根据符号的不同为+无穷大或-无穷大

如果e是255,f不是0,则该值是一个具有某种实现定义语义的NaN


要对浮点值进行编码,请确定符号,然后计算两个值中不大于该值大小的最大幂。二的幂等于无偏指数。然后将值除以二的幂,并将其四舍五入以适应有效位,这就得到了有效位。当舍入将有效位推到2(您必须调整指数)时,以及当指数大到足以下溢或小到足以下溢到非规范范围(低于偏差指数为1或更大的范围)时,会出现一些特殊情况。

如果您想了解详细信息,请在web上查找。但要用十六进制表示它,只需生成数字,获取单个字节,并生成它们的十六进制表示。你需要的两样东西
union {
    float f;
    double d;
    unsigned char c[8];
} foo;

foo.d = 3.14156;
for(int i=0;i<8;i++) printf("%02X",foo.c[i]);
Float.floatToRawIntBits(floatValue)
Double.doubleToRawLongBits(doubleValue)
Float.intBitsToDouble(intValue)
Double.longBitsToDouble(longValue)