2016-03-01 79 views
-1

这个问题可能是很基本的,但只有在使用Google的天,在C.符号int范围混乱

符号整数的我应有基本的了解

其实有些人说有符号整数的范围有我在这里发布

  1. -32767〜32767和其他人说,它具有范围
  2. -32768至32767

让我们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)

+0

您已经回答了您的问题。你在问什么?也许你想搜索“有符号整数的表示”。还要注意这两个假设实际上并不是完整的事实。 – Olaf

+0

C中的int没有固定的指定大小。只有最小值被定义。在2的补码中,一个n比特类型的范围从'-2 ^(n-1)到'2 ^(n-1)-1' –

+2

它依赖于底层平台,如果它使用[补码] ://en.wikipedia.org/wiki/Ones'_complement)或[two's complement](https://en.wikipedia.org/wiki/Two's_complement)(二进制补码是常用补码)。至于位的大小,它也取决于,而这些天'int'通常是32位。 –

回答

3

这取决于你的环境,通常int可以存储-2147483648到2147483647如果是32位长,补码时,但C规范说int可以存储至少 -32767〜32767

从整数类型的N1256 5.2.4.2.1规格报价< limits.h中>

他们实现定义的值应相等或gr以相同的符号在所示的那些的量级(绝对值)上消费。

- int类型的一个目的
INT_MIN最小值-32767 // - (2- - 1)
- int类型的一个目的最大值
INT_MAX 32767 // 2 - 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,最小公分母。

+0

如果带符号的位通常以二进制补码形式完成,那么显然-32768至32767必须是正确的范围?那么它们的含义至少为-32767至至少32767 – adi

+1

100s 2015年有数百万处理器由8位和16位寄存器构成,用于编程这些嵌入式处理器的编译器使用16位“int”。 C在那里很受欢迎。几乎没有旧的平台。 – chux

+0

@adi:标准不能保证二进制补码符号(正如我写的,其他符号存在)。该标准也没有指定int类型的16位宽度(很明显)。所以所有的标准*保证*正是我写的:'INT_MIN'必须*至少* -32767,'INT_MAX'至少* * 32767。我不知道一个系统将这两个常量定义为*这些值,它们只是*保证的最小值*。 – DevSolar

0

32767是,你可以在16位有符号整数,代表最大正值。 C对应的类型是short

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

无论架构如何,int的最小值为INT_MIN,最大值为intINT_MAX

类似,也有常数以获取shortSHRT_MINSHRT_MAX),longchar等使用硬编码的常量或猜测是int的最小值你不需要的最小值和最大值的系统。


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

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

0

C标准规定了整数值的最低限度。因为它是写在标准(整数类型5.2.4.2.1大小)

  1. ...其实现定义的值应等于或大于 的大小(绝对值)与所示的符号相同。

对于类型int这些最低限值是对象

- int类型的一个目的最小值

INT_MIN -32767 // −(215 − 1) 

- int类型的一个目的最大值

INT_MAX +32767 // 215 − 1 

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

考虑到32768的数量级大于标准中使用的值。所以它符合标准要求。

另一方面HABD为表示“符号和幅度”的限制(当使用2个字节)将是相同的如图所示的标准即-32767:32767

所以在实现中使用的实际极限取决于整数的宽度及其表示。

1

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

C和高便携性,以新老平台的它的优势的整点是代码不应该关心

C定义了带有2个宏的int的范围:INT_MININT_MAX。 C规格指定:
INT_MIN是-32,767 或更少
INT_MAX是+32,767 或更多

如果代码需要16位二进制补码类型,请使用int16_t。如果代码需要32位或更宽的类型,请使用longint32least_t等。不要假定int是没有定义的代码。

+0

感谢你的回应。当代码需要2的补码和符号/幅度表示? – adi

+0

@adi 1)当代码需要2的补码时,使用精确的宽度类型,比如'uint8_t','int64_t'等。2)如果代码需要_sign/magnitude representation_, - 无法帮到你。 3)但最重要的是,避免编码需要特定底层表示的地方。 4)使用各个位时,使用无符号类型。 – chux

+0

是依赖于数据类型范围的编译器还是计算机体系结构? – adi