byte类型的数在JAVA中占1个字节,也就是8位,那么8位中除去一个符号位,表示数值的共有七位。
例如:1000 0000 中1就是符号位,表示负数。
0111 1111 中0也是符号位,表示正数。
剩余7位表示数值,根据二进制的计算方法,byte8位一共可以表示-128~127。
为什么正数只能表示到127,而负数可以表示到-128呢?
这涉及到了0的问题
1000 0000 按照之前的规定来看,首位1代表符号位,说明是负数,后7位代表数值0。这样看来,1000 0000就代表了-0这个数。
0000 0000 同理,按照之前的规定来看,首位0代表符号位,说明是负数,后7位代表数值0。这样看来,1000 0000就代表了+0这个数,0这个数是不需要使用2种正负去表示的,+0和-0这样就浪费了一个表示数值。所以规定1000 0000代表-128,第一位不止是符号位了,或者说,规定1000 0000就是-128,这样就导致了我们可以表示-128~127的数,正数比负数可以表示的数少一,就少在了这个-0上。
再说溢出问题
byte a = 127;byte b = -128;(byte)(a+1);(byte)(b-1);
这样就出现了一个问题,也就是溢出问题,因为byte只能表示8位,数值就是-128~127,现在127+1和-128-1都导致超出了byte所能表示的范围,那么就代表数据溢出了。
现在需要大家明白一个问题就是,计算机中,是使用补码进行运算的,正数的补码和原码还有反码都一样。但是负数就不一样。补码是源码取反+1.同理原码是补码取反+1.
明白了以上这个概念,我们就可以继续往下走了。
127是正数,所以表示为0111 1111.
127 + 1 = 128 表示位 1000 0000.
你可以发现现在符号值变成了1,从0变成1.那么现在在系统中就是表示为一个负数,我们可以发现这个数1000 0000和之前我们规定的-128的值是一样的,对127+1现在就转化成了-128.
同理-128是1000 0000,我们对它进行减一,那么就是-129 转化成二进制就是 11000 0001而在计算时需要转化成补码也就是 原码取反10111 1110 再+1 10111 1111,而我们byte只能放下8位,所以原本的符号位顶掉了,所以值就变为0111 1111,也就是127.这就是byte的溢出问题。