黑马程序员技术交流社区

标题: 入学菜鸟提问:为什么int的取值范围是-2^31~2^31-1 ;而不是-2^32~2^32? [打印本页]

作者: 夜的剪影    时间: 2016-7-20 23:09
标题: 入学菜鸟提问:为什么int的取值范围是-2^31~2^31-1 ;而不是-2^32~2^32?
为什么int的取值范围是-2^31~2^31-1  ;而不是-2^32~2^32?
作者: 逆风搁浅    时间: 2016-7-21 00:08
因为int是四个字节  最大就是0111 1111 1111 1111 1111 1111 1111 1111
作者: Sachiel    时间: 2016-7-21 00:28
曾经也被这个问题纠结,记住就行了
作者: winslow    时间: 2016-7-21 10:12
自己计算下最高位就懂了,0111 1111 1111 1111
作者: cat73    时间: 2016-7-21 10:29
int 总共有 32 个 bit,因此可以表示 2^32 种不同的状态。
2^32 = 2^31 + 2^31。

-1 -2 -3 是 3 个数字,同理可证:-1 ~ -2^31 是 2 ^ 31 个数字。
OK,一半数字就这么没了。
0 1 2 是 3 个数字,注意 最大的数字是 2,但这是 3 个数字。
所以 0 ~ 2^31 是 2^31 + 1 个数字。
2^31 + 2^31 + 1 = 2^32 + 1,这超出了 int 的 32 个 bit 可以表达的范围。

所以说,0 以上的部分实际上是 0 ~ 2^31 - 1,总共是 2^31 个数字。
2^31 + 2^31 = 2^32 个数字,刚刚好够 int 的 32 个 bit 存开的。

作者: cat73    时间: 2016-7-21 10:42
或者用个好理解点的说法,实际 int 在计算机中不是这么存储的,我这么说是为了好理解
我们都知道 int 最高位为符号位,那么还剩下 31 位,容量就是 2 ^ 31,根据符号位不同,一半跟正数,一半给负数。
那么正数很简单,0 就是所有位都是 0,1 是最低位为 1,其他为 0,以此类推。

那么负数呢?难道我们还需要一个 -0 么?我们已经有正数的 0 了,不需要再有一个负数的 0。
所以说,负数的 0 用来代表 -1 好了,负数的 1 用来代表 -2。
因此负数比正数需要表示的东西少了一个 0,自然就比正数多表示一个数。
作者: 不作熊孩子    时间: 2016-7-21 10:43
因为还有个0啊,算在了里面嘛
作者: wanglv110    时间: 2016-7-21 12:58
cat73 发表于 2016-7-21 10:42
或者用个好理解点的说法,实际 int 在计算机中不是这么存储的,我这么说是为了好理解:
我们都知道 int 最 ...

这个解释看懂了,很好很形象
作者: wanglv110    时间: 2016-7-21 12:59
cat73 发表于 2016-7-21 10:42
或者用个好理解点的说法,实际 int 在计算机中不是这么存储的,我这么说是为了好理解:
我们都知道 int 最 ...

这个解释看懂了,很好很形象
作者: 夜的剪影    时间: 2016-7-21 17:36
逆风搁浅 发表于 2016-7-21 00:08
因为int是四个字节  最大就是0111 1111 1111 1111 1111 1111 1111 1111

为什么又2^31 -1 呢? 先记住吧,学完这个后面看看数据结构里面会不会提到
作者: leekly    时间: 2016-7-21 17:45
最高位是符号位
作者: 夜的剪影    时间: 2016-7-21 17:50
cat73 发表于 2016-7-21 10:42
或者用个好理解点的说法,实际 int 在计算机中不是这么存储的,我这么说是为了好理解:
我们都知道 int 最 ...

{:3_47:} Thank you
作者: frozentears    时间: 2016-7-21 19:11
因为还有个0
作者: 失落魔法    时间: 2016-7-21 20:26
因为int是四个字节  最大就是0111 1111 1111 1111 1111 1111 1111 1111
作者: elopment    时间: 2016-7-21 21:28
最高位是符号位?
作者: qetu001212    时间: 2016-7-21 21:48
int类型的数据占4个字节,1个字节站8bit,所以int类型数据用2进制表示就是
01111111    11111111    11111111    11111111  这个就是最大值2^31-1
10000000    00000000    00000000    00000000  这个就是最小值-2^31

作者: q123123    时间: 2016-7-21 21:55
最高位是正负号
作者: 新晋猿工    时间: 2016-7-23 14:38
cat73 发表于 2016-7-21 10:42
或者用个好理解点的说法,实际 int 在计算机中不是这么存储的,我这么说是为了好理解:
我们都知道 int 最 ...

6666666666666666666
作者: accomplonely    时间: 2016-7-24 10:57
因为有一个0  他都是0最高位对他没影响。所以就是这样咯
作者: bhc702178    时间: 2016-7-24 12:47
因为机器识别的二进制数,最高位是符号位,int四个字节,01111111 11111111 11111111 11111111这就是int二进制最大值(首位0表示正数),这个数就是2^31-1




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2