将int的EOF分配给ARM与x86_64上的char行为

时间:2018-11-08 17:16:40

标签: casting char int variable-assignment eof

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

为什么会这样?

1 个答案:

答案 0 :(得分:1)

char带符号(即-128到127)或无符号(范围从0到255)来实现。

  • ARM gcc 的组合中,显然没有签名。 因此-1转换为255。

  • x86_64 gcc 的组合中,已签名。因此,-1为 保留。