字节是否可能被某种方式洗牌了?您描述的位的排列(字节2中的符号位,字节1中的指数的LSB)与您链接到的附录O不同。看起来字节1和2被交换了。在
我假设字节3和4也被交换了,因此实际的十六进制值是43D4DB93。这转换成二进制的01000111011001011011010110010010010011001,因此符号位为0,表示正数。指数为10000111(二进制)=135(十进制),表示系数为2^(135-128)=128。最后,尾数是0.11010110110010010010011(二进制),使用附录O,你必须在前面加上0.1,这大约是十进制的0.8314。所以根据我的假设,你的数字是0.8314*128=106.4。在
添加:一些Python 2代码可能会澄清:input = 0xD44393DB;
reshuffled = ((input & 0xFF00FF00) >> 8) | ((input & 0x00FF00FF) << 8);
signbit = (reshuffled & 0x80000000) >> 31;
exponent = ((reshuffled & 0x7F800000) >> 23) - 128;
mantissa = float((reshuffled & 0x007FFFFF) | 0x00800000) / 2**24;
result = (-1)**signbit * mantissa * 2**exponent;
这将产生result = 106.42885589599609。在
下面是计算尾数的一条线的解释。首先,reshuffled & 0x007FFFFF产生编码尾数的23位:1010100110110110011。然后... | 0x00800000设置隐藏位,得到11010101011010110010010010011。我们现在要计算分数0.11010110110010010010011。根据定义,这等于1*2^(-1) + 1*2^(-2) + 0*2^(-3) + ... + 1*2^(-23) + 1*2^(-24)。这也可以写成(1*2^23 + 1*2^22 + 0*2^21 + ... + 1*2^1 + 1*2^0) / 2^24。括号中的表达式是11010101011010110010010011(二进制)的值,因此我们可以通过将(reshuffled & 0x007FFFFF) | 0x00800000除以2^24来找到尾数。在