为什么int的范围是-1?

时间:2013-10-12 11:20:37

标签: c numbers int range number-systems

我读到int的范围取决于一个字节。

因此将int设为4个字节长,即4 * 8位= 32位。

所以范围应该是:2 ^(32-1)= 2 ^(31)

为什么有些人说它的^ ^ 31 - 1虽然?

谢谢!

5 个答案:

答案 0 :(得分:5)

因为计数从0开始

int的范围是 2,147,483,647 2 ^ 32 ,这是 2,147,483,648 。因此我们减去 1

1位的丢失也是正负号

检查此兴趣wiki关于整数的文章: -

  

正整数的最常见表示是字符串   比特,使用二进制数字系统。内存字节的顺序   存储比特各不相同;看到字节序。宽度或精度   整数类型是其表示中的位数。一个完整的   n位的类型可以编码2n个数字;例如,无符号类型   通常表示非负值0到2n-1。其他   有时使用整数值到位模式的编码   示例二进制编码的十进制或格雷码,或打印字符   代码如ASCII。

     

有四种众所周知的方式来表示二进制中的带符号数字   计算系统。最常见的是两个补码,它允许一个   带有n位的有符号整数类型表示-2(n-1)中的数字   通过2(n-1)-1。二进制补码算法很方便,因为   表示之间存在完美的一对一对应关系   和值(特别是没有单独的+0和-0),因为   加法,减法和乘法不需要区分   有符号和无符号类型之间。其他可能性包括偏移   二元,符号幅度和补码。

答案 1 :(得分:1)

你的意思是2 32 -1,而不是2 32-1

但你的问题是为什么人们使用2 31 。如果int是签名的那么丢失一点。你丢失了第一位,表明这个数字是正数还是负数。

signed int(32位)的范围是-2,147,483,648到+2,147,483,647。 无符号整数(32位)的范围为0到4,294,967,295(即2 32 -1)。

答案 2 :(得分:0)

2 32-1 与2 32 - 1不同(因为0包含在范围内,我们减去1)

为了您的理解,让我们替换为小数字4而不是32

2 4-1 = 8 而2 4 -1 = 16-1 = 15。

希望这有帮助!

答案 3 :(得分:0)

int是签名数据类型。 第一位表示符号,后跟值的位。 如果符号位为0,则该值只是设置为1的所有位的总和(为2的幂)。

e.g。 0 ... 00101是2 0 + 2 2 = 5

如果第一位为1,则值为-2 32 +所有位的总和设置为1(2的幂)。

e.g。 1 ... 111100是-2 32 + 2 31 + 2 30 + ... + 2 2 = -4

全0将导致零。

当你计算之后,你会看到范围之间(包括)2 31 和2 0 + ... + 2 之间的任何数字31 = 2 32 - 1可以用这32位创建。

答案 4 :(得分:0)

因为整数是32位。它可以存储总共2 ^ 32个值。因此整数范围从-2 ^ 31到2 ^ 31-1,总共有2 ^ 32个值(负范围内的2 ^ 31个值,正范围内包含0的2 ^ 31个值)。但是,第一个位(最重要的位是为整数的符号保留的。你需要了解负整数是如何存储的。它们以2的补码形式存储,因此-9将被存储为2的2的补码。 所以9存储在32位系统中 0000 0000 0000 0000 0000 0000 0000 1001 和-9将存储为 1111 1111 1111 1111 1111 1111 1111 0111(2的补码9)。

同样由于对整数进行一些算术运算,如果它恰好超过最大值(2 ^ 31-1),那么它将循环到负值。因此,如果您添加1到2 ^ 31-1,它将为您提供-2 ^ 31。