Присвоение 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 сохраняется.