类型转换

时间:2015-07-29 09:37:14

标签: c casting logic

我真的不明白为什么我必须在之后对变量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

1 个答案:

答案 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 */