Ios 浮点数是如何以十六进制表示的?
我正在将数据从iPhone传输到从设备,在那里传输需要16位数据值。现在我有一个需要传输的浮点值,但是我怎么知道它有多大,它是如何用十六进制表示的呢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位浮点数与此类似 考
需要十六进制表示,因为我可能需要切换下半字节和上半字节 在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)