使用“普通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(==)比较不起作用?
谢谢,
马丁。
答案 0 :(得分:10)
因为整数提升会导致右侧的数学运算为int
。如果您将结果分配回char
unsigned char Z = ~X
,那么这些高位将被再次截断并Y == Z
。
答案 1 :(得分:5)
〜运算符使其操作数在被补充之前被提升为int。 〜15不是240而是其他一些值,具体取决于int的大小。
只需使用if (X + Y == 255)
即可。