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

calculation of limits of char without using macro definitions

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

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

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

~(unsigned char)0 

来自

(unsigned char)~0

这一位给出了正确答案 那么这两个有什么不同

(char)((unsigned char)~0 >> 1) 是 127 的原因很明显 - 你有 0xFFFFFFFF,将它转换为无符号字符,你得到 0xFF,移位 1,你有 0x7F 或 127。

奇怪的是第一个错误的原因:您将零转换为 unsigned char。然后你补充那个。但是运算符 ~ 实际上提升了它的操作数:

The integer promotions are performed on the operand, and the result has the promoted type.

(n1570 第 6.5.3.3 节)

If an int can represent all values of the original type (as restricted by the width, for a bit-field), the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions. All other types are unchanged by the integer promotions

(n1570 第 6.3.1.1 节)

因为 int 可以存储 unsigned char 的所有值,所以结果是一个 int。你移动一个,然后投射,导致 -1