无符号字符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
b
和c
都被提升为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) /* ... */