Присвоение EOF int поведению char на ARM vs x86_64

Я запускаю этот фрагмент кода как на 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

Почему это происходит?

1 ответ

Решение

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

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

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

Другие вопросы по тегам