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) /* ... */