为什么int类型的范围会减1?

11

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

因此,如果将int视为4个字节长,那么就是4 * 8位 = 32位。

因此,其范围应该是:2 ^ (32-1) = 2 ^ (31)

但是为什么有些人说它是2^31 -1?

谢谢!


一个二进制位的最大值是 1,这是因为 (2^1) - 1 = 2 - 1 = 1 而不是因为 2^(1-1) = 2^0 = 1 - Grijesh Chauhan
5个回答

7

因为计数从0开始

而int的范围是2,147,483,6472^32,即2,147,483,648。因此我们要减去1

同时,1位的损失是为了正负号

请查看这篇有趣的wiki关于整数的文章:

正整数的最常见表示形式是使用二进制数字系统的位串。存储位的内存字节的顺序有所不同;参见字节序。整数类型的宽度或精度是其表示中的位数。一个有n个位的整数类型可以编码 2^n 个数字;例如,无符号类型通常表示非负值 0 到 2^(n−1)。有时会使用其他将整数值编码为位模式的编码方式,例如二进制编码十进制或格雷码,或作为打印字符代码,例如 ASCII。
在二进制计算系统中,有四种众所周知的表示有符号数的方法。最常见的是二补数,它允许带有 n 个位的有符号整数类型表示从 −2^(n−1) 到 2^(n−1)−1 的数字。二补数算术很方便,因为表示和值之间存在完美的一对一的对应关系(特别是没有单独的 +0 和 −0),并且加法、减法和乘法不需要区分有符号和无符号类型。其他可能性包括偏移二进制、符号-大小和反码。

3
您的意思是2的32次方减一,而不是2的32-1次方。
但您的问题是关于为什么人们使用2的31次方。如果int是有符号的,则失去一个整个位。您会失去第一个位以指示数字是正数还是负数。
有符号int(32位)的范围为-2,147,483,648到+2,147,483,647。 无符号int(32位)的范围为0到4,294,967,295(即2的32次方-1)。

0

232-1 不等于 232 - 1(因为范围包括0,所以要减去1)

为了方便理解,我们用小数字4代替32

24-1 = 8 而 24-1 = 16-1 = 15。

希望这能帮到你!


1
can use <sup> </sup> if you want - Grijesh Chauhan
@Grijesh Chauhan - 嘿,谢谢。我是 Stack Overflow 的新手。还需要学习格式化样式 :) - Dev
欢迎来到SO,学习格式化技巧 - Grijesh Chauhan

0
int是一种带符号的数据类型。第一个位表示符号,后面是数值的位数。如果符号位为0,则值简单地是所有置为1的位的和(2的幂)。
例如,0...00101是2^0 + 2^2 = 5
如果第一个位为1,则值为-2^32 + 所有置为1的位的和(2的幂)。
例如,1...111100是-2^32 + 2^31 + 2^30 + ... + 2^2 = -4
全部为0将得到零结果。
当你进行计算后,你会发现在范围-2^31到2^0 + ... + 2^31 = 2^32 - 1之间(包括边界),可以用这32位来表示任意数字。

0

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

再次由于对整数进行某些算术运算时,如果超过了最大值(2^31-1),则会循环到负值。因此,如果将1加到2^31-1,则会得到-2^31。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接