Назначение EOF int для поведения char на ARM vs x86_64 - PullRequest
0 голосов
/ 08 ноября 2018

Я выполняю этот фрагмент кода как на ARM (iMX6), так и на 64-разрядной версии Intel:

#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 голосов
/ 08 ноября 2018

Это определяется реализацией, если char подписано (то есть в диапазоне от -128 до 127) или не подписано (в диапазоне от 0 до 255).

  • В вашей комбинации ARM и gcc он явно не подписан. Поэтому -1 преобразуется в 255.

  • В вашей комбинации x86_64 и gcc он подписан. Следовательно, -1 сохраняется.

...