首页 > 解决方案 > 在 ARM 与 x86_64 上将 int 的 EOF 分配给 char 行为

问题描述

我在 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

然而,结果却大不相同:

手臂:

i = -1, d = 255
i is EOF

x86_64:

i = -1, d = -1
i is EOF
d is EOF

为什么会这样?

标签: castingcharintvariable-assignmenteof

解决方案


它是char有符号的(即范围从-128 到127)还是无符号的(范围从0 到255)是实现定义的。

  • 在您的ARMgcc组合中,它显然是无符号的。因此 -1 转换为 255。

  • x86_64gcc的组合中,它已签名。因此,-1 被保留。


推荐阅读