我试图使用以下表达式计算char类型的限制。
(char)(~(unsigned char)0 >> 1)
我预计这等于127,但答案是-1。
然后我替换了这个表达。
~(unsigned char)0
通过
(unsigned char)~0
这个给出了正确的答案 那么这两种不同
答案 0 :(得分: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
可以存储unsigned char
的所有值,因此结果为int。你移动一个,然后施放,导致-1