byte类型由一个字节即8位二进制数组成,比如01111111表示正数1.首位表示符号位,0表示正数,1表示负数.
计算机内的数据都是以补码来储存的,正数的补码是本身,负数的补码就是反码加1.
反码是人计算补码的,规定正数的反码是本身,负数的反码是符号位不变,其余位取反.
计算机的计算只有加法计算,比如2-3会等价于2+(-3),
2的源码是00000010,补码是00000010,
-3的源码是10000011,反码是11111100,补码是11111101,
计算机中两者补码相加,即00000010+11111101=11111111;
而-1的补码正好是11111111.
但是这样一来会出现10000000和00000000两个补码都表示0,一个+0,一个-0,而数学只有一个0,多出的一个补码怎么办呢?
于是印度阿三就人为规定10000000作为-128的补码;这也刚好符合计算机补码计算规则.
例如-128+127,即补码1000000+01111111=11111111,即-1;
实际上8位二进制原码只能表示-127~127,即11111111~01111111;
8位补码才能表示-128~127,即人为规定10000000为-128的补码.