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)
这个给出正确的答案那么这两者有何不同
原因(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