为什么Java中基本类型的取值范围正值比负值少1?
一、Java中的基本类型
二、正零与负零
*以byte为例 *
byte 1字节 8位
正值范围:0000 0000 -0111 1111
负值范围:1000 0000-11111 1111
其中,首位为符号位,后七位为数值位
那么,会出现 0000 0000(正零)
1000 0000(负零)
零只需要一种变现形式,因此,利用补码将负零表示为-128
三、原码、反码、补码
正数以0001 0101为例
原码:0001 0101
反码:0001 0101(不变)
补码:0001 0101(不变)
负数以1001 0101为例
原码:1001 0101
反码:1110 1010(符号位不变,数值位取反)
补码:1110 1011(反码加1)
对于负零1000 0000
原码:1000 0000
反码:1111 1111(符号位不变,数值位取反)
补码:1111 1111+1=1000 0000(反码加1,此时加1后,符号位不变,因此,首位1即表示符号位,也表示数值位,即-128,将负零转换成-128)
四、总结
正数原码、反码、补码都相同
负数反码为原码符号位不变数值位取反,补码为反码数值位加1
为什么正值比负值少1
因为0000 0000(正零)和1000 0000(负零)都表示零,没有意义,因此将1000 0000的第一位既看作符号位,又看成数值位,将其表示为-128,因此,正值比负值少1