ИЛИ оператор в C не работает - PullRequest
4 голосов
/ 27 августа 2011

Я не понимаю, почему последний код printf в приведенном ниже коде не печатает 255.

char c;
c = c & 0;
printf("The value of c is %d", (int)c);
int j = 255;
c = (c | j);
printf("The value of c is %d", (int)c);

Ответы [ 4 ]

16 голосов
/ 27 августа 2011

В большинстве реализаций тип char подписан, поэтому он варьируется от -128 до 127.

Это означает, что 11111111 (что 255 записано в двоичном виде) равнодо -1.(Так как оно представлено как значение, хранящееся в дополнении до двух )

Чтобы получить то, что вы ожидаете, вам нужно объявить c как unsigned char, например:

unsigned char c = 0;
int j = 255;
c = (c | j);
printf("The value of c is %d", (int)c);
5 голосов
/ 27 августа 2011

Вероятно, это печать -1.Это потому, что

c = (c | j);

будет оцениваться как

c = (0 | 255) = (0 | 0xFF) = 0xFF

, но, поскольку c подписано, 0xFF будет -1, а не 255, как вы ожидали.Если вы измените c на unsigned char, будет напечатано 255, как вы себе представляли.

2 голосов
/ 27 августа 2011

Попробуйте заменить char c на unsigned char c. В основном, тип char поддерживает значения от -128 до 127. Ваш результат превышает поддерживаемый диапазон и переполняется.

0 голосов
/ 27 августа 2011

По умолчанию char это signed char в C. Если вы хотите печатать 255, используйте unsigned char Однако я объясняю вывод в контексте signed char так что концепция становится понятной. Если вы напишите j=127, тогда вы получите 127, поскольку битовое представление - 01111111. Но если вы напишите j=128 тогда он напечатает -128 потому что битовое представление 01111111 увеличилось на 1 и стало 10000000. теперь, если вы напишите j=255 тогда битовое представление равно 11111111. поэтому оно выведет -1 Если вы напишите j=256 тогда он напечатает 0 потому что, когда битовое представление 11111111 увеличивается на 1, оно становится 100000000. Но для символьной переменной выделяется только 1 байт, поэтому самый левый бит не сохраняется, а битовое представление становится 00000000. Дальше если пишешь j=257 тогда это также случай переполнения и битовое представление становится 00000001, и будет напечатано 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...