我真的不明白为什么我必须在之后对变量b
进行类型转换
反转(一元operator ~
)。任何人都可以解释为什么需要它吗?
unsigned char a = 0xFF;
unsigned char b = 0x00;
return (a == (~b)); //expected to return 1 but 0
...
return (a == (unsigned char)(~b)); //after typecast returns 1 as expected
答案 0 :(得分:5)
~b
的结果属于提升类型int
(通常是b
与任何其他一元运算符+
,-
或~
的结果所以你需要对结果进行类型转换。
来自C11规范草案第6.5.3.3节一元算术运算符:
〜运算符的结果是它的按位补码 (提升)操作数(即,如果和,则设置结果中的每个位 仅当未设置转换后的操作数中的相应位时)。 整数提升在操作数和结果上执行 具有提升类型。如果提升的类型是无符号类型,则 表达式~E相当于可表示的最大值 类型减去E 。
所以,
unsigned char b = 0x00;
/* ~b = 0xFFFFFFFF (assuming 4 byte int), (unsigned char)~b = 0xFF */