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
andc
both get promoted toint
. That means you're really doing:That ends up comparing:
Which don't match. It works in your first case because your
char
type is signed, and gets sign extended in the promotion:Because of standard integral promotions: In the expression
~b
, the operand is promoted toint
, which could be something like0x000000FF
; the result is the integer0xFFFFFF00
.You have to convert the result back to
unsigned char
: