一、先给结论
$-2^{31} \sim 2^{31}-1$ ,也就是$-2147483648 \sim 2147483647$
二、计算公式推导
这涉及到数学公式的推导,我们来以简单的四位二进制进行模拟,然后再找出规律:
第4位 | 第3位 | 第2位 | 第1位 |
---|---|---|---|
8 | 4 | 2 | 1 |
最大的表示值$=15$,这个$15$是怎么算出来的呢?是我们一位一位的加出来的啊!我们来换个角度看这个问题:
令
$ \ \ \ \ \ \ \ s=8+4+2+1$
变形
$① \ \ \ \ s=2^3+2^2+2^1+2^0$
关键步骤来了,等式左右都乘以2:
$② \ \ \ \ 2 * s=2 * (2^3+2^2+2^1+2^0)=2^4+2^3+2^2+2^1$
将$ ②- ① $
$ s=2^4-2^0=2^4-1$
推广到$n$位二进制数,就是 $s_n=2^{n}-1$
而$int$共4
个字节,每个字节8
个$bit$位,就是32
个$bit$位。而首位是符号位,不能用,只有$31$位用于保存数字,所以,数据上限就是$2^{31}-1=2147483647$,而数据下限则是 $-(2^{31}-1)=-2147483647$
三、不是说最小是 $-2147483648$吗,你上边算的是$-2147483647$啊!
(1) 正整数在计算机中以原码保存
(2) 负整数在计算机中以补码保存。
啥是原码,啥是补码? 原码是就二进制的原始形式,补码:原码除符号位之外取反后加1
$1000 \ \ 0000 |\ \ 0000\ \ 0000 | \ \ 0000\ \ 0000 | \ \ 0000\ \ 0001$ -1
的原码
$1111 \ \ 1111 |\ \ 1111 \ \ 1111 | \ \ 1111\ \ 1111 | \ \ 1111 \ \ 1110$ -1
的反码,再对反码加1
$1111 \ \ 1111 |\ \ 1111 \ \ 1111 | \ \ 1111 \ \ 1111 | \ \ 1111 \ \ 1111$ 这就是负数-1
的补码了
那么负整数在内存中的$32$位最大可以表示为
$1111 \ \ 1111 | \ \ 1111 \ \ 1111 | \ \ 1111 \ \ 1111 |\ \ 1111 \ \ 1111$ 这个是最大负整数的原码了,也就是$-(2^{31}-1)=-2147483647$那么为什么范围是$-2147483648$开始呢???
$1000 \ \ 0000 |\ \ 0000\ \ 0000 |\ \ 0000 \ \ 0000 |\ \ 0000 \ \ 0001$ 这个是最大负整数对应的补码了,那么还有一种情况没有包含进去,就是当补码是全$0$的情况,也就是$-0$这种情况,在二进制中$0$可以表示为$-0$和$+0$这两种情况,但是$0$只有一个,所以取$-0$这种情况。