Java的byte类型取值范围是-128~127为什么负数是128正数到127呢
概念:java中用补码表示二进制数,补码的最高位是符号位,最高位为“0”表示正数,最高位为“1”表示负数。
在了解byte取值范围之前,我们需要先了解原码、反码、补码
- 正数的原码、反码、补码是一样的 (都是其本身)
- 负数的反码是对其原码 逐位取反,但符号位除外 ;即(符号位不变,其余位取反即1变成0,0变成1 )
- 负数的补码是在其反码的末位加1。
栗子:
+21,其二进制表示形式是00010101,则其补码同样为00010101
-21,按照概念其绝对值为00010101,各位取反为11101010,再加1为11101011,即-21的二进制表示形式为11101011
- 1
- 2
-
byte为一字节8位,最高位是符号位(0正1负),剩余七位为数值位,即最大值是0111 1111,因正数的补码是其本身,即此正数为0111 1111,十进制表示形式为127。
-
既然有了127,那么就知道了-127,-127的原码就是1111 1111,负数的补码是原码取反(符号位不取反)加1;-127的原码是1111 1111,反码是 1000 0000 ,补码是 1000 0001。
-
下面来解释-128是怎么来的:
-0的原码是1000 0000,反码是 1111 1111,补码是 10000 0000 ,因为byte只识别8位字节,
所以补码是 0000 0000 。+0的原码是 0000 0000 ,反码补码都是其本身,还是0000 0000,我们日常中没 有-0,所以规定0在计算机中国表示为 0000 0000。
以0开头的补码已经全部使用,因为正数原码、补码都是一样的,所以 0000 0001 到 01111 1111补码已经全部占用。
-
以-1开头的原码:
原码 -1 是 1000 0001 , -127是 1111 1111 反码 是 1111 1110 , 是 1000 0000 补码 是 1111 1111 , 是 1000 0001 即补码 1111 1111 到补码 1000 0001 表示 -1 到 -127
- 1
- 2
- 3
- 4
- 5
- 6
- 7
如图:
此时还剩一串补码1000 0000,就把这串码表示为-128( -128只有补码10000000,没有反码和原码,具体为何要把1000 0000表示为-128。
不知道这样解释是否合理,不赞同的欢迎讨论哈! )