签名int范围混乱
这个问题可能是非常基本的,但我只是在谷歌搜索几天之后,以及我对C中签名整数的正确基本理解。
实际上有人说签名int有范围
- -32767到32767和其他人说它有范围
- -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_MIN
和INT_MAX
。 C规范指定:
INT_MIN
是-32,767 或更低 。
INT_MAX
为INT_MAX
或更高 。
如果代码需要16位2的补码类型,请使用int16_t
。 如果代码需要32位或更宽的类型,请使用long
或int32least_t
等。不要代码假设int
是未定义的东西。
值32767
是您可以在带符号的16位整数上表示的最大正值。 C
对应的类型很short
。
int
类型至少表示为与short
相同的字节数,最多表示与long
相同的字节数。 16位处理器上int
的大小为2个字节(与short
相同)。 在32位及更高的体系结构上, int
的大小为4个字节(与long
相同)。
无论架构如何, int
的INT_MIN
为INT_MIN
, int
的最大值为INT_MAX
。
类似地,有一些常量可以获得最小值和最小值( SHRT_MIN
和SHRT_MAX
), long
, char
等。您不需要使用硬编码常量或猜测系统上int
的最小值。
表示#1被命名为“符号和幅度表示” 。 它是一个理论模型,它使用最重要的字节来存储符号,其余的字节用于存储数字的绝对值。 一些早期的计算机使用它,可能是因为它似乎是数学中数字表示的自然地图。 但是,二进制计算机并不自然。
表示#2被命名为two's complement
。 二进制补码系统的优点是加法,减法和乘法的基本算术运算与无符号二进制数的基本算术运算相同(只要输入以相同的位数表示,超出这些位的任何溢出都将被丢弃从结果)。 这就是现在它是首选编码的原因。
C标准指定整数值的最低限制。 正如它在标准中所写(5.2.4.2.1整数类型的大小)
- ……它们的实现定义值的大小 (绝对值)应等于或大于显示的值,并带有相同的符号。
对于int
类型的对象,这些最低限制是
– int类型对象的最小值
INT_MIN -32767 // −(215 − 1)
– int类型对象的最大值
INT_MAX +32767 // 215 − 1
对于整数的二进制补码表示,正值的数量比负值的数量少一个。 因此,如果只有两个字节用于int类型对象的表示,那么INT_MIN
将等于-32768
。
考虑到32768的幅度大于标准中使用的值。 所以它满足标准要求。
在表示“符号和幅度”的另一个habd上,限制(当使用2个字节时)将与标准中显示的相同,即-32767:32767
因此,实现中使用的实际限制取决于整数的宽度及其表示。