最近回头看看基础,又忘记了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,是有实际数学计算意义的)又是原来的负数。这就是补码,补码是用来给计算机看的,要不计算机不知道什么是负数,什么是减法!

一个字节是8位,最高位是符号位,最高位为0则是正数。最高位为1则是负数

如果一个数是正数,最大数则为:01111111,转为十进制为127,

如果一个数是负数,按照一般人都会觉得是11111111,转为十进制为-127,

但是:一个+0表示为:00000000,一个-0表示为:1000000,因为符号位不算在里面,所以就会有两个0,所以从一开始发明二进制的时候,就把-0规定为-128,如此二进制的补码就刚好在计算机中运作中吻合。

公式:计算一个数据类型的数据大小范围:-2^(字节数8-1)~2^(字节数8-1)-1

转自:https://blog.csdn.net/weixin_38357164/article/details/87912475