【发布时间】:2018-03-25 15:28:58
【问题描述】:
我在做作业时错过了一个问题。
计算机内存中存储数据的地方有big-endian存储和small-endian存储两种方式,为了检测一种机器存储方式,有同学写了如下程序:
union NUM {
int a;
char b;
} num;
int main(){
num.b = 0xff;
if (num.a! = 0xff)
printf ("bigend");
else
printf ("smallend");
return 0;
}
但是他发现在x86机器上运行的程序,打印出来的其实是'bigend',这显然是错误的。你知道问题出在哪里吗? 这个程序应该如何修改?
我问过我的老师,题目是对的。我在一些网站上找到了一些信息,但这让我更加困惑。为什么这个问题不正确?问题究竟出在哪里?
【问题讨论】:
-
您应该尝试在 x86 计算机上使用显示“bigend”的调试器进行调试。
-
如果将
0xff替换为0x1,试试看是否有效。 -
如果 num 是静态/全局变量,它应该可以工作。否则它可能会失败,因为并非
a的所有字节都已初始化。 0xFF 是有问题的,因为它取决于 char 的签名,尽管在这种特殊情况下它可能不是问题。 -
... 或者只是 printf
num.a并查看它的实际内容。
标签: c cpu-architecture