Mar*_*ton 8 c type-conversion integer-promotion language-lawyer
想象一下这种情况.int32_t
是一个扩展的整数类型,它以二进制补码表示(作为int32_t
要表示的标准).这意味着INT32_MIN
是-2147483648
(0x80000000
).
同时int
是标准整数类型,它以一个补码表示(标准允许).这意味着INT_MIN
是-2147483647
.
现在纠正我,如果我错了,但我认为两种类型都有相同的宽度,这意味着,根据6.3.1.1.1(强调我的):
任何标准整数类型的等级应大于具有相同宽度的任何扩展整数类型的等级.
所以排名int32_t
低于int
.
现在6.3.1.8(通常的算术转换)说(强调我的):
<...>否则,将对两个操作数执行整数提升.然后将以下规则应用于提升的操作数:如果两个操作数具有相同的类型,则不需要进一步转换.否则,如果两个操作数都具有有符号整数类型或两者都具有无符号整数类型,则具有较小整数转换等级类型的操作数将转换为具有更高等级的操作数的类型.
因此,如果正确理解它,在此代码块中:
int32_t x = INT32_MIN;
int y = 1;
x + y; // What happens here?
Run Code Online (Sandbox Code Playgroud)
在表达式中x + y
,x
必须被提升为int
,并且INT32_MIN
超出范围int
.
这是标准中的错误还是我遗漏了什么?
换句话说,x + y
根据标准的定义,此上下文中的表达式评估了什么?
use*_*ica 12
int32_t
是可选的.一致的实现不能有32位二进制补码int
和32位二进制补码扩展整数类型int32_t
; 如果int
是一个补充,int32_t
很可能不会提供.
这是32位一的补码int
和32位二进制补码扩展整数类型int32_t
不能共存的原因之一.引用N1570草案:
7.20.2指定宽度整数类型的限制
1以下类似对象的宏指定了声明的类型的最小和最大限制
<stdint.h>
.每个宏名称对应于7.20.1中的类似类型名称.2任何已定义宏的每个实例都应替换为适用于#if预处理指令的常量表达式,并且此表达式应具有与根据整数提升转换的对应类型的对象的表达式相同的类型.它的实现定义值的大小(绝对值)应等于或大于下面给出的相应值,具有相同的符号,除非声明的是给定值.
...
INTN_MIN exactly -(2N-1)
在您描述的情况下,INT32_MIN
必须具有-2 ^ 31的值,但由于整数提升,它必须具有不能保存该值的类型.这种矛盾完全阻止了提供int32_t
.