类型转换

use*_*407 4 c logic casting

我真的不明白为什么我必须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
Run Code Online (Sandbox Code Playgroud)

Moh*_*ain 5

结果~b就是推动型的int(一般结果b与其他任何一元运算符+,-~),所以你需要强制转换的结果.

来自C11规范草案第6.5.3.3节一元算术运算符:

〜运算符的结果是其(提升的)操作数的按位补码(即,当且仅当未设置转换后的操作数中的相应位时,才会设置结果中的每个位). 整数提升在操作数上执行,结果具有提升类型.如果提升的类型是一个无符号类型,表达式〜E是相当于在该类型减去Ë最大值表示的.

所以,

unsigned char b = 0x00;
/* ~b = 0xFFFFFFFF (assuming 4 byte int), (unsigned char)~b = 0xFF */
Run Code Online (Sandbox Code Playgroud)