当int32_t是扩展整数类型且int是32位补码标准整数类型时,(INT32_MIN + 1)是什么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当int32_t是扩展整数类型且int是32位补码标准整数类型时,(INT32_MIN + 1)是什么相关的知识,希望对你有一定的参考价值。

想象一下这种情况。 int32_t是一个扩展的整数类型,它以二进制补码表示(作为标准要求int32_t表示)。这意味着INT32_MIN-21474836480x80000000)。

同时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必须被提升为intINT32_MIN超出int的范围。

这是标准中的错误还是我遗漏了什么?

换句话说,正如标准所定义的那样,x + y在这种情况下的表达式是什么?

答案

int32_t是可选的。一致的实现不能有32位的补码int和32位的二进制补码扩展整数类型int32_t;如果int是一个补充,很可能不会提供int32_t

这是32位一的补码int和32位二进制补码扩展整数类型int32_t不能共存的原因之一。引用N1570 draft

7.20.2指定宽度整数类型的限制

1以下类似对象的宏指定<stdint.h>中声明的类型的最小和最大限制。每个宏名称对应于7.20.1中的类似类型名称。

2任何已定义宏的每个实例都应替换为适用于#if预处理指令的常量表达式,并且此表达式应具有与根据整数提升转换的对应类型的对象的表达式相同的类型。它的实现定义值的大小(绝对值)应等于或大于下面给出的相应值,具有相同的符号,除非声明的是给定值。

...

INTN_MIN                                  exactly -(2N-1)

在您描述的情况下,INT32_MIN必须具有正确的值^ ^ 31,但由于整数提升,它必须具有不能保持该值的类型。这种矛盾完全阻止了提供int32_t

另一答案

同时int是一个标准整数类型,它以一个补码表示

扩展整数是实现定义的,只需要是二进制数,有符号整数需要用一个补码,二进制补码或符号和幅度表示法表示。

intxx_t是一个固定大小的int类型,它必须具有与int相同的表示形式。因为intxx_t是2的补码,所以它要求int是相同的。

以上是关于当int32_t是扩展整数类型且int是32位补码标准整数类型时,(INT32_MIN + 1)是什么的主要内容,如果未能解决你的问题,请参考以下文章

原始数据类型

_int64

int,int32_t,int64_t

int,int32_t,int64_t

在 32 位系统上使用 int64_t 而不是 int32_t 对性能有何影响?

Java:二进制(原码反码补码)与位运算