这个问题,我在基于x86的FreeBSD上做实验,和基于SPARC的Solaris上做实验的结果不一样。 前者的结果是-0.124685,后者是0。 显然,%f把后面的数当成浮点数对待,而代码中的10和3两个数字,默认被当成了整数,用后缀格式写就是10UL和3UL,除法的结果向下取整得到了3UL,在寄存器中是0x00000003. 那么,为什么同样是0x00000003,当作浮点数处理的时候,x86和SPARC的结果不一样呢? 翻开IEEE754标准,对单精度浮点数的说法: http://en.wikipedia.org/wiki/Single_precision_floating-point_format 注意这个图。x86是小端处理器,低位(LSB)在低地址,高位(MSB) 在高地址,所以0x00000003的第0个字节是0x03,其他3个字节是0,在内存中的二进制是 00000011 00000000 00000000 00000000 (低位) (高位) 按照IEEE单精度浮点数的格式: sigh(符号位)0b 有效值部分:11000000b 指数部分:0b 于是,%f将其解释为-0.124685 而SPARC是大端处理器,低位(LSB)在高地址,高位(MSB) 在低地址,0x00000003在内存中是: 00000000 00000000 00000000 00000011 低位 高位 按照IEEE单精度浮点数的格式:
sigh(符号位)0b
有效值部分:0b 指数部分:110b 所以,最后得到的是0。 |