参考:https://blog.csdn.net/qq_22771739/article/details/84496115
https://blog.csdn.net/boatalways/article/details/17027573
Java的byte类型取值范围是-128~127为什么负数是128正数到127呢
首先需要了解原码反码和补码
正数的原码反码补码是一样的
[+2]=[00000010]原=[00000010]反=[00000010]补
对于负数来说,它的原码反码补码就不相同
[-2]=[10000010]原=[11111101]反=[11111110]补
最高位表示符号位0代表正数1代表负数,负数计算反码的规则是符号位不变,其余位取反即1变成0,0变成1,补码就是反码再加1
为什么要设计出反码和补码
因为计算机只有加法没有,减法,在做减法运算的时候,可以认为是加上一个负数,这样可以减少计算机电路的复杂度
使用原码进行减法运算会出现问题,例如计算1-1,因为计算机没有加法只有减法,所以计算机自动换算成1+(-1)
1-1=1+(-1)=[00000001]原+[10000001]原=[10000010]原=-2 (符号位也参与运算)
而1-1的实际结果是0
为了解决这个问题,于是使用反码运算
1-1=1+(-1)=[00000001]原+[10000001]原=[00000001]反+[11111110]反=[11111111]反=[10000000]原=-0
通过反码计算的结果是11111111在计算一次反就成原码了,得出的结果是正确的,但是有一个问题是 00000000可以代表+0 10000000可以代表-0,其实是一样的,用2个编码实在是浪费。于是出现了补码解决0的符号以及两个编码的问题