【发布时间】:2018-01-11 03:34:01
【问题描述】:
我的编程环境是 gcc 版本 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)
我的代码如下:
#include <stdio.h>
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, int len){
int i;
for (i = 0; i<len; i++)
printf(" %.2x", start[i]);
printf("\n");
}
void show_float(float x){
show_bytes((byte_pointer)&x, sizeof(float));
}
int main(){
int y = 0xffffff;
float f = y;
show_float(f);
return 0;
}
机器给出结果:00 00 00 e0
我认为根据 IEEE 754 是不对的;但我不知道为什么。
而 Windows 中 VS 2013 中的相同代码给出了正确答案:ff ff 7f 4b
gcc 5.4.0 不采用 IEEE 754 吗? 还是我的代码有问题?
【问题讨论】:
-
不要
typedef指点迷津;那就是疯狂.... -
此代码使用 gcc 4.9.4 为我输出
ff ff 7f 4b -
我在 Windows 上使用 mingw-64 7.1.0 得到了相同的输出 (
ff ff 7f 4b)。如果您确实运行了完全相同的代码,那么它似乎必须使用不同的表示。我建议您尝试一些其他数字,看看它们的比较情况 -
你的机器是小端还是大端? (你可以用宏检查
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) -
刚刚使用 gcc 5.4 将您的代码粘贴到 godbolt.org/g/cZGBuA。在 main 的组装中,它清楚地用 -O2 加载了 0x4b7fffff。使用 -O1 时,常数会在某处发出并被引用。如果编码不同,硬件指令将不起作用,假设这些指令与 IEEE754 一起工作
标签: c linux gcc floating-point ieee-754