不使用宏定义计算char的限制

mon*_*nty 4 c casting bitwise-operators

我试图使用以下表达式计算char类型的限制.

(char)(~(unsigned char)0 >> 1)
Run Code Online (Sandbox Code Playgroud)

我预计这将等于127,但答案是-1.
然后我替换了这个表达式.

~(unsigned char)0 
Run Code Online (Sandbox Code Playgroud)

通过

(unsigned char)~0
Run Code Online (Sandbox Code Playgroud)

这个给出正确的答案那么这两者有何不同

mti*_*nic 5

原因(char)((unsigned char)~0 >> 1)是127很明显 - 你有0xFFFFFFFF,把它转换成unsigned char,你得到0xFF,移一个你有0x7F或127.

奇怪的是为什么第一个错误:你将零转换为unsigned char.然后你补充一下.但是运营商~实际上提升了它的操作数:

整数提升在操作数上执行,结果具有提升类型.

(n1570第6.5.3.3节)

如果int可以表示原始类型的所有值(由宽度限制,对于位字段),则该值将转换为int; 否则,它将转换为unsigned int.这些被称为整数促销.整数促销不会更改所有其他类型

(n1570第6.3.1.1节)

由于int可以存储a的所有值unsigned char,因此结果为int.你移动一个,然后施放,导致-1