关于int型最大值最小值的思考

找了很多资料,都讲的是原码、补码、反码知识,说明int型最大值是2147483647,最小值是-2147483648。
但是还是一头雾水,想到为什么最大值不是2 ^31呢,实际上为2 ^31-1?
前提已经知道在计算机中第32位为符号位,那剩余的31位可以表示2^31位数吧?
原来这里面有个+0,所以要-1。
那负数呢?负数一样有2^31位,最小值为 -2 ^31.没-1是因为负数的补码表示。先贤为了节省计算机空间,发明了补码。因此**-0和+0均表示0,共同占用1位**。因此负数部分就空出1位,-2 ^31用来补充-0的空位。

//没懂的话看下面这个例子: https://www.jianshu.com/p/35cf507ebe7f

区分就看第一个bit位,第一个bit如果是0则是正数,如果为1则是负数。看到这里就有疑问了,如果第一个bit位表示符号,那么剩下的7位能表示的范围只能是0到2^7-1=127了,岂不是全部数据范围就是-127~127(包括0)共255个数字,先前我们说了,8bit可以表达256个状态,怎么少了一个呢? 原来正0(00000000)和负0(100000000)都是0,计算意义上看也就是重复表达同样的意义,浪费了一个状态表示。为了不浪费资源,尽可能多的存储数据范围,先贤发明了补码表示负数,即一个负数可以用对应的正数的补码表示,而补码=(正数)原码取反(=反码)+1
现在我们用定义一个byte变量值是-127,内存如何存储呢?即求补码
1.127的2进制原码=01111111,
2.求反码=源码取反=10000000
3.反码加1后变成10000001,这就是-127的2进制表示 OK,现在反过来看,计算机指令看到一个byte类型变量值是10000001,怎么得到-127呢? 就是上面求补码的逆向过程,
1.发现第一bit位是1,知道这是补码,是负数
2.补码减1 得出反码=10000000
3.反码取反得到原码=01111111,这就是正数127的2进制表示
4.因此10000001的值就是-127 接下来继续解释:

byte的最大值为什么是127? 因为第一个bit是符号位,那么正数最大只能是01111111=2^7 - 1 = 127
0的补码和原码是一样的 按照上面补码的求解过程 0的原码=00000000→反码11111111 +
1→补码00000000(最高进位丢弃),嗯,也就是说正负0只用一个状态表示。 为什么byte最小值是-128?
我们已经了解,每一个正数有一个对应的补码表示负数,但是通过上面的分析,我们发现-127~127(包括0也没有重复表示)共255个状态,还有一个状态10000000没有利用,它是多少呢?
1.发现第一bit位是1,知道这是补码,是负数
2.补码减1 得出反码=01111111
3.反码取反得到原码=10000000=(128)(我们说原码时,并没有提符号位,仅仅是2进制表示) 注意补码和原码一致,似乎可以即表示128,也可表示-128,但注意与前面的定义保持一致,也为方便计算机识别处理,首位是1即是负数,因此只能是-128了。

你可能感兴趣的:(算法竞赛入门-第一章练习)