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

时间:2015-06-02 19:08:53

标签: c casting bitwise-operators

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

(char)(~(unsigned char)0 >> 1)

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

~(unsigned char)0 

通过

(unsigned char)~0

这个给出了正确的答案 那么这两种不同

1 个答案:

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