java中byte类型表示范围为什么是-128~127?

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的补码.

经验分享 程序员 微信小程序 职场和发展