无符号字符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 

但是,我得到OK 1和坏2!

如果unsigned char b是255(11111111),那么~b应该是00000000.为什么它不等于c?

我使用gcc在Linux SUSE上工作。

你被整数促销活动所困扰。 当你这样做时:

 ~b == c 

bc都被提升为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) /* ... */