在计算机内,定点数有3种表示法:原码、反码和补码
原码 :二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码 :正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码 :正数的补码与其原码相同;负数的补码是将其原码的除符号位外的所有位,逐位取反,然后加1。
Java中用补码表示二进制数,补码的最高位是符号位,最高位为“0”表示正数,最高位为“1”表示负数。
正数的补码是其本身;
负数的补码是将其原码的除符号位外的所有位,逐位取反,然后加1。
例如:
+21,其源码是00010101,则其补码同样为00010101。
-21,按照其源码为10010101,除符号位外 逐位取反得到11101010,再加1得到11101011。即-21的二进制表示形式为11101011
byte类型的最大值为什么是127?
byte为一字节8位,正数最高位是符号位为0,即最大值的原码是01111111。又因为正数的补码是其本身,所以最大的正数的补码为01111111,十进制表示形式为127 。
byte类型的最小值为什么是 -128?
计算机强行规定了最小值是-128,其补码为10000000,且-128是没有原码和反码的。
"+0"的补码是00000000,那么“-0”的补码即10000000该怎么处理呢? 总不能浪费一个位置吧。于是计算机就把“-0”的位置给了“-128”。也就是计算机规定了补码1000 0000代表“-128”
其实这么设计也是很巧妙的:
(1)
127(0111 1111)加1(0000 0001)刚好得到-128(1000 0000)。
-128(1000 0000)加1(0000 00001)等于-127(1000 0001)。
这样从-128~127的补码首尾相连,形成了一个闭环,像时钟一样,一圈一圈的轮回。
(2)
在计算机中减法运算可以转换成加法运算,比如8-1——>8+(-1)——>补码运算:(0000 1000) + (1111 1111) = (0000 0111) 刚好是7。-128+127——>(1000 0000) + (0111 1111) = (1111 1111)刚好是-1,-128的补码完美的适用于减法。
总结
原码 | 反码 | 补码 | |
127 | 011111111 | 01111111 | 01111111 |
0 | 00000000 | 0000 0000 | 0000 0000 |
-1 | 10000001 | 11111110 | 11111111 |
-127 | 11111111 | 10000000 | 10000001 |
-128 | 10000000 |