与C~运算符混淆(按位不)并比较char变量

时间:2011-10-29 18:26:58

标签: c byte bit-manipulation

使用“普通C”,我希望比较两个8位字节,以确定第二个是第一个的按位补码。例如,如果Byte1是二进制00001111(十进制为15),我想测试Byte2是否为二进制11110000(十进制为240)。我希望使用无符号字符表示字节,C按位NOT运算符“〜”和简单的if(==)测试。

任何人都可以向我解释为什么以下代码不起作用(即我希望它输出“True”但它实际输出“False”)。

unsigned char X = 15;
unsigned char Y = 240;  

if( Y == ~X)
    printf("True");
else
    printf("False");

我想我可以将字节排在一起然后测试255,但为什么上面的if(==)比较不起作用?

谢谢,

马丁。

2 个答案:

答案 0 :(得分:10)

因为整数提升会导致右侧的数学运算为int。如果您将结果分配回char unsigned char Z = ~X,那么这些高位将被再次截断并Y == Z

答案 1 :(得分:5)

〜运算符使其操作数在被补充之前被提升为int。 〜15不是240而是其他一些值,具体取决于int的大小。

只需使用if (X + Y == 255)即可。