在计算机系统中,数值一律用补码来存储
@Test
public void toBinaryString() {
System.out.println( -1 + " <=> " + Integer.toBinaryString(-1) + " <=> " + 0b11111111111111111111111111111111);
}
//执行结果
-1 <=> 11111111111111111111111111111111 <=> -1
二进制反码、补码计算方式
- 对于正数,其二进制原码、反码、补码均为相同的,为原码的形式。
- 对于负数:
– 反码:符号位不变,其余各个位取反(1变0,0变1)
– 补码:反码 +1
– 符号位:最高位(最左边)表示符号位,其中1表示负,0表示正
示例:
此处用8个数位来运算,首位是符号位,0表示正,1表示负
求 -5 的补码
原码:
1000 0101
反码:
1111 1010
补码:
1111 1011
减法运算转换成加法运算:
a - b = a + (-b) 示例 :
二进制减法示例:
3 - 7 = 3 + (-7)
此处用8个数位来运算,首位是符号位,0表示正,1表示负
3 与 -7 原、反、补码如下:
原
0000 0011 1000 0111
反
0000 0011 1111 1000
补
0000 0011 1111 1001
补码求和:
0000 0011
1111 1001
+
---------------
1111 1100
注:运算结果直接以补码形式保存到计算机中
补码的补码即原码,1111 1100 的原码为 1000 0100 即 -4
两数相减,可转换为补码求和,推广到N进制,这里以10进制为例:
56 - 12 = 56 + (-12)
此处用4个数位来运算,首位是符号位,0表示正,9表示负
56 与 -12 的原、反、补码如下:
原
0056 9012
反
0056 9987
补
0056 9988
补码求和:
0056
9988
+
-------------------------------
10044
0044 最左边的1溢出,得到结果 0044
参考: