签名int范围混乱

这个问题可能是非常基本的,但我只是在谷歌搜索几天之后,以及我对C中签名整数的正确基本理解。

实际上有人说签名int有范围

  1. -32767到32767和其他人说它有范围
  2. -32768到32767

让我们得到int a = 5(签名/让我们考虑只有1个字节)

* a = 5的第一个表示forms为00000101为正数,a = -5表示为10000101(因此范围-32767至32767对齐)(此处msb /符号位为1/0,数字为正数/负和rest(幅度位)不变)

* a = 5的第二个表示forms为00000101为正数,a = -5表示为11111011(msb被视为-128,其余位被操纵以获得-5)(因此范围-32768以32767为理由)

所以我在这两件事之间混淆了。 我怀疑是c,1)或2)中signed int的实际范围是多少

这取决于您的环境,如果它是32位长并且使用了二进制补码,则int通常可以存储-2147483648到2147483647,但是C规范说int可以存储至少 -32767到32767。

引自N1256 5.2.4.2.1整数类型的大小

它们的实现定义值的大小(绝对值)应等于或大于显示的值,具有相同的符号。

– int类型对象的最小值
INT_MIN -32767 // – (2 15 – 1)
– int类型对象的最大值
INT_MAX +32767 // 2 15 – 1`

今天,签名的整数通常用两个补码表示 。

最高位是“符号位”,它设置为所有负数。

这意味着您有七位代表不同的值。

如果未设置最高位,则可以(总共16位)表示值0..32767。

如果设置了最高位,并且因为您已经有零表示 ,则可以表示值-1 ..- 32768。

然而,这是实现定义的 ,其他表示也确实存在。 平台/编译器上的有符号整数的实际范围限制是在您的环境的找到的范围限制。 这是唯一明确的权威。

在今天的桌面系统中, int通常为32或64位宽,相应的范围比你所说的16位32767/32768大得多。 因此,无论是那些人都在谈论真正的旧平台, 真正的旧知识,嵌入式系统或最小保证范围 – 标准规定INT_MIN必须至少为 -32767,而INT_MAX 至少为 +32767,这是最低的公分母。

我的疑问是c中的signed int的实际范围是什么,1) [-32767 to 32767]或2) [-32768 to 32767]

C的重点及其对新旧平台的高可移植性的优点是代码不应该关心

C使用2个宏定义int的范围: INT_MININT_MAX 。 C规范指定:
INT_MIN是-32,767 或更低
INT_MAXINT_MAX 或更高

如果代码需要16位2的补码类型,请使用int16_t 。 如果代码需要32位或更宽的类型,请使用longint32least_t等。不要代码假设int是未定义的东西。

32767是您可以在带符号的16位整数上表示的最大正值。 C对应的类型很short

int类型至少表示为与short相同的字节数,最多表示与long相同的字节数。 16位处理器上int的大小为2个字节(与short相同)。 在32位及更高的体系结构上, int的大小为4个字节(与long相同)。

无论架构如何, intINT_MININT_MINint的最大值为INT_MAX

类似地,有一些常量可以获得最小值和最小值( SHRT_MINSHRT_MAX ), longchar等。您不需要使用硬编码常量或猜测系统上int的最小值。


表示#1被命名为“符号和幅度表示” 。 它是一个理论模型,它使用最重要的字节来存储符号,其余的字节用于存储数字的绝对值。 一些早期的计算机使用它,可能是因为它似乎是数学中数字表示的自然地图。 但是,二进制计算机并不自然。

表示#2被命名为two's complement 。 二进制补码系统的优点是加法,减法和乘法的基本算术运算与无符号二进制数的基本算术运算相同(只要输入以相同的位数表示,超出这些位的任何溢出都将被丢弃从结果)。 这就是现在它是首选编码的原因。

C标准指定整数值的最低限制。 正如它在标准中所写(5.2.4.2.1整数类型的大小)

  1. ……它们的实现定义值的大小 (绝对值)应等于或大于显示的值,并带有相同的符号。

对于int类型的对象,这些最低限制是

– int类型对象的最小值

 INT_MIN -32767 // −(215 − 1) 

– int类型对象的最大值

 INT_MAX +32767 // 215 − 1 

对于整数的二进制补码表示,正值的数量比负值的数量少一个。 因此,如果只有两个字节用于int类型对象的表示,那么INT_MIN将等于-32768

考虑到32768的幅度大于标准中使用的值。 所以它满足标准要求。

在表示“符号和幅度”的另一个habd上,限制(当使用2个字节时)将与标准中显示的相同,即-32767:32767

因此,实现中使用的实际限制取决于整数的宽度及其表示。