不使用宏定义计算 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
我试图使用以下表达式计算 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