最近回头看看基础,又忘记了byte 一个字节的数据大小范围为什么是-128~127是怎么来的了,后来想通以后,记了下来!
1:首先我们知道计算机底层都是加法计数器运算,不能计算减法,但是我们生活中还必须有负数,有减法,这样符合正常的人类数学思维习惯。
2:我们还知道一个byte字节占八位,也就是八位1和0组成的二进制数串,这个数串最小是00000000,最大是11111111,也就是表示了0-255的范围,这个都懂,那么问题来了。这个范围都是正的啊,没有负数,没有负数就没有减法,怎么办?
3:其实我们正好反过来解决了这个问题,计算机底层都是要将一个byte存储的负数转换成0-255范围的正数来计数的,但是按照人类的习惯,要直接在写代码的时候就有负数,有减法才能符合人类的思维习惯,那么怎么将负数和减法在计算机的世界里表现出来呢。这时候补码就诞生了。
4:在了解补码之前首先了解什么是同模(数学世界里的)
一个时钟显示共有十二个小时,时针旋转一周后回到原来的状态,实际的数学意义没有变化,变化的是物理意义。时间前进了!!!但是就单单论数学模型意义来讲,该计时系统的Mod为12,也就是说,时针顺时针转8和逆时针转4,效果是一样的。为了符合数学意义,顺时针为+8,逆时针为-4,综上所述: 得 |+8|+|-4|=12
由此,可以得到一个结论。这种周期性变化的计数模型系统,一个状态加减整数倍的Mod,其状态不会有不会发生变化。
5:了解了同模之后呢,人们开始思考一个数是正还是负唯一区别就是符号了,那么计算机只认识0和1,怎么能认识正负呢?首先观察如下:
00000000=0 11111111=255
00000001 =1 11111110=254
00000010=2 11111101=253
。。。。。。
11111101=253 00000010=2
11111110=254 00000001 =1
11111111=255 00000000=0
我们发现计数器循环一遍又回到了起点(正好走了一倍的mod),证明计数器具有周期性!我们又知道了具有周期性的数学模型,可以按照数学同模的逻辑思考,如下:
00000000=0 11111111=255= -1
00000001 =1 11111110=254= -2
00000010=2 11111101=253= -3
。。。。。。我们顺着规律一直到:
01111111=127 10000000=128=-128
10000000=128 01111111=127=-127
10000001=129 01111110=126=-126
。。。。。。
我们又发现:当01111111+1=10000000时,这个时候最高位从全是0变化到全是1,根据这个条件,我们恰好可以放入区分正负的条件0和1,也就是——最高位代表符号位。
通过观察最高位为0即为正数,所以正数的最大为:127,根据同模概念,负数最大就是-128.
6:那么问题又来了???
计算机表示很无奈。同模那是你们人类的思维,我可不明白同模是啥,我只认识0和1.这怎么办呢???
聪明的人们通过实验规律对比,发明了计算机二进制的补码。那就是惊人的巧合!!!!
补码:去除最高位符号位:正数剩余的位数正好和对应的负数剩余的位数全部相反,相反后+1(补回符号位的实际意义,因为符号位是1,是有实际数学计算意义的)又是原来的负数。这就是补码,补码是用来给计算机看的,要不计算机不知道什么是负数,什么是减法!