从十六进制字节710e00fe计算整数:尾数计算疑问求助
问题原因:字节序(端序)不匹配
你的问题核心是系统内存的字节存储顺序(小端序)和你手动计算时默认的大端顺序不一致,具体拆解如下:
- 你给出的十六进制字节串
710e00fe,按书写顺序是四个独立字节:0x71、0x0e、0x00、0xfe。 - iOS/macOS等系统默认采用小端序存储多字节数据,也就是把低字节放在内存低地址,高字节放在高地址。所以这段字节在内存中的实际存储顺序是反过来的:
0xfe、0x00、0x0e、0x71。 - 你的代码
*(int*)([bytes bytes])直接把内存内容转成int,得到的实际值是0xfe000e71(小端序拼接的结果)。 - 基于这个int值计算:
exp = value >> 24:0xfe000e71是有符号int,右移24位时符号位扩展,0xfe对应十进制-2,所以得到exp=-2。mantissa = value & 0x00FFFFFF:0xfe000e71 & 0x00FFFFFF结果是0x00000e71,转十进制就是3697。
而你手动计算时,肯定是直接把710e00fe当成大端序的int值(也就是0x710e00fe),此时取& 0x00FFFFFF得到的是0x0e00fe,转十进制是917758,这就会出现“尾数数值极大”的情况。
如果要让手动计算结果和代码一致,需要先把字节串按小端序重新拼接成int值,再进行位运算。
内容的提问来源于stack exchange,提问作者Grew112
相关产品推荐
相关产品推荐

