简体   繁体   中英

Unsigned char c = 255 is “11111111” or not?

Here is my problem code:

#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");
}

I expected this to print:

OK 1

OK 2

But, I get OK 1 and bad 2!

If unsigned char b is 255 (11111111), then ~b should be 00000000. Why does it not equal c?

I work on Linux SUSE, using gcc.

You're getting bitten by integer promotions. When you do:

~b == c

b and c both get promoted to int . That means you're really doing:

~0x000000ff == 0

That ends up comparing:

0xffffff00 == 0

Which don't match. It works in your first case because your char type is signed, and gets sign extended in the promotion:

~a == c
~(-1) == 0
~0xffffffff == 0
0 == 0

Because of standard integral promotions: In the expression ~b , the operand is promoted to int , which could be something like 0x000000FF ; the result is the integer 0xFFFFFF00 .

You have to convert the result back to unsigned char :

if ((unsigned char)(~b) == c) /* ... */

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM