我正在ARM(iMX6)和Intel 64位上运行此代码段:
#include <stdio.h>
int main()
{
int i = EOF;
char d = i;
printf("i = %d, d = %d\n", i, d);
if (i == EOF)
printf ("i is EOF\n");
if (d == EOF)
printf ("d is EOF\n");
return 0;
}
在两种情况下,我都使用gcc 5.4进行了编译: ARM:gcc(Ubuntu / Linaro 5.4.0-6ubuntu1〜16.04.10)5.4.0 20160609 x86_64:gcc(Ubuntu 5.4.0-6ubuntu1〜16.04.10)5.4.0 20160609
但是,结果却大不相同:
ARM:
i = -1, d = 255
i is EOF
x86_64:
i = -1, d = -1
i is EOF
d is EOF
为什么会这样?
答案 0 :(得分:1)
由char
带符号(即-128到127)或无符号(范围从0到255)来实现。
在 ARM 和 gcc 的组合中,显然没有签名。 因此-1转换为255。
在 x86_64 和 gcc 的组合中,已签名。因此,-1为 保留。