想象一下这种情况。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?在表达式x + y中,必须将x提升为int,而INT32_MIN超出了int的范围。
这是标准中的错误还是我遗漏了什么?
换句话说,按照标准的定义,这个上下文中的x + y表达式是什么?
发布于 2017-12-28 17:20:57
同时,int是一个标准的整数类型,它用补语表示。
扩展整数是实现定义的,只需要是二进制数,有符号整数必须用一个补数、两个补数或符号和幅度表示法表示。
intxx_t是一个固定大小的int类型,它必须具有与int相同的表示形式。因为intxx_t是两个补码,所以它要求int是相同的。
https://stackoverflow.com/questions/48011642
复制相似问题