这是我的问题代码:
#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
但是,我得到了1和坏2!
如果unsigned char b
是255(11111111),则〜b应为00000000.为什么它不等于c?
我在Linux SUSE上工作,使用gcc。
答案 0 :(得分:12)
你被整数促销活动所困扰。当你这样做时:
~b == c
b
和c
都会升级为int
。这意味着你真的在做:
~0x000000ff == 0
最终比较:
0xffffff00 == 0
哪个不匹配。它适用于您的第一种情况,因为您的char
类型已签名,并在促销中获得了扩展标记:
~a == c
~(-1) == 0
~0xffffffff == 0
0 == 0
答案 1 :(得分:2)
由于标准整数促销:在表达式~b
中,操作数被提升为int
,这可能类似于0x000000FF
;结果是整数0xFFFFFF00
。
您必须将结果转换回unsigned char
:
if ((unsigned char)(~b) == c) /* ... */