将 int 的 EOF 分配给 ARM 上的 char 行为与 x86_64
Assignment EOF of int to char behavior on ARM vs x86_64
我是 运行 ARM (iMX6) 和英特尔 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
然而,结果却大不相同:
手臂:
i = -1, d = 255
i is EOF
x86_64:
i = -1, d = -1
i is EOF
d is EOF
为什么会这样?
如果 char
是有符号的(即范围从 -128 到 127)或者是无符号的(范围从 0 到 255),它是实现定义的。
在 ARM 和 gcc 的组合中,它显然是未签名的。
因此-1被转换为255。
在 x86_64 和 gcc 的组合中,它已签名。因此,-1 是
保留。
我是 运行 ARM (iMX6) 和英特尔 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
然而,结果却大不相同:
手臂:
i = -1, d = 255
i is EOF
x86_64:
i = -1, d = -1
i is EOF
d is EOF
为什么会这样?
如果 char
是有符号的(即范围从 -128 到 127)或者是无符号的(范围从 0 到 255),它是实现定义的。
在 ARM 和 gcc 的组合中,它显然是未签名的。 因此-1被转换为255。
在 x86_64 和 gcc 的组合中,它已签名。因此,-1 是 保留。