签名int范围混乱

时间:2016-03-01 14:24:27

标签: c int signed

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

实际上有人说signed int有范围

  1. -32767到32767,其他人说它有范围
  2. -32768至32767
  3. 让我们得到int a = 5(签名/让我们考虑只有1个字节)

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

    * a = 5的第二个表示形式为00000101,为正数,a = -5表示为11111011 (msb被认为是-128,其余的位被操纵以获得-5)(所以范围-32768到32767是合理的)

    所以我在这两件事之间混淆了。我怀疑是c,1)或2)

    中signed signed的实际范围是多少

5 个答案:

答案 0 :(得分:3)

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

引自N1256 5.2.4.2.1整数类型的大小< limits.h>

  

它们的实现定义值的大小(绝对值)应与所示值相等或更大,且符号相同。

     

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

答案 1 :(得分:3)

今天,签名的整数通常在two's complement notation完成。

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

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

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

最高位设置因为您已经有零的表示,您可以表示值-1 ..- 32768。

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

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

答案 2 :(得分:1)

  

我怀疑c,1)<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="text">c</div>或2)[-32767 to 32767]中签名int的实际范围是什么?

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

C定义[-32768 to 32767]与2个宏的范围:intINT_MIN。 C规范指定:
INT_MAX是-32,767 或更少 INT_MIN是+32,767 或更多

如果代码需要16位2的补码类型,请使用INT_MAX。如果代码需要32位或更宽的类型,请使用int16_tlong等。不要假设int32least_t是未定义的代码。

答案 3 :(得分:0)

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

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

无论架构如何,int的最小值为INT_MINint的最大值为INT_MAX

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

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

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

答案 4 :(得分:0)

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

  
      
  1. ......他们的实现定义值应相等或更大   幅度(绝对值)显示的那些,具有相同的符号。
  2.   

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

- int类型对象的最小值

INT_MIN -32767 // −(215 − 1)

- int类型对象的最大值

INT_MAX +32767 // 215 − 1

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

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

另一方面代表&#34;标志和数量&#34;限制(使用2个字节时)与标准-32767:32767

中显示的相同

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