Unsigned char c = 255 является "11111111" или нет?
вот мой код проблемы:
#include "stdio.h"
int main()
{
char a = -1;
unsigned char b = 255;
unsigned char c = 0;
if((~a) == c)
printf("OK 1");
else
printf("bad 1");
printf("n");
if((~b) == c)
printf("OK 2");
else
printf("bad 2");
printf("n");
}
Я ожидал, что это напечатает:
OK 1
OK 2
но, я получаю хорошо 1 и плохо 2!
Если unsigned char b
равно 255 (11111111), тогда ~b должно быть 00000000. Почему он не равен c?
Я работаю над Linux SUSE, используя gcc.
2 ответов
вас кусают целочисленные акции. Когда вы делаете:
~b == c
b
и c
как получить звание int
. Это означает, что вы действительно делаете:
~0x000000ff == 0
это заканчивается сравнением:
0xffffff00 == 0
, которые не соответствуют. Он работает в вашем первом случае, потому что ваш char
тип подписан, и получает знак расширенный в акции:
~a == c
~(-1) == 0
~0xffffffff == 0
0 == 0
из-за стандартных интегральных рекламных акций: в выражении ~b
операнд назначен int
, что может быть что-то вроде 0x000000FF
; результатом является целое число 0xFFFFFF00
.
вы должны преобразовать результат обратно в unsigned char
:
if ((unsigned char)(~b) == c) /* ... */