byte是JAVA中最基础的一种数据类型,字节长度是1字节,取值范围是-128~127。
字节是计算机信息技术用于计量存储容量和传输容量的一种计量单位,一个字节等于八位二进制。即1byte = 8bit。
想知道byte类型 127+1是 -128,就必须知道数据在计算机中的存储形式。
计算机对数据的二进制存储形式——补码
以十进制数45和-45为例
原码:
-
45:00101101
-
-45:11010011
在最高位符号位区分正数还是负数,0代表正数,1代表负数
反码: -
45:00101101
-
-45:11010011
正数的原码和反码相同,负数的反码是原码的符号位不变,其余各位按位取反
补码: -
45:00101101
-
-45:11010011
正数的原码反码补码都相同,负数的补码等于在其反码基础上末尾加1
** 计算机设计反码的原因**
因为计算机只有加法,没有减法,再做减法运算的时候,可以认为是加上一个负数,这样可以减少计算电路的复杂度,是原码进行减法运算会出现的问题,例如计算1+1,因为计算机中有加法,没有减法,所以,计算机会自动换成1+(-1) -
原码的结果为-2与实际不相符
-
反码的结果为-0, 计算结果正确但浪费编码的位置
-
砝码的计算结果为0,也不会出现±0的问题
总结: 反码是为了解决减法运算补码,是为了解决反码产生±0的问题
** Byte类型中127+1是-128的原因**
使用补码不仅仅修复了零的符号以及存在两个编码的问题,而且还能多表示一个低位数,这也就是为什么八位二进制,使用原码和反码表示的范围为-127~127,使用补码表示的范围是-128 ~127。
因为机器使用补码,所以对编程中常用到的32位int类型可以表示范围是-231 ~ 231-1,因为第一位表示的示符号为20用补码,表示时又可以多保存一个最小值。
我认为byte型数据在计算机中的存储可以看成一个圆环。