在计算机系统中,数值一律用补码来存储
@Testpublic 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 00111111 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
补码求和:00569988+-------------------------------100440044 最左边的1溢出,得到结果 0044
参考:
- 原码、反码、补码
- 计算机内存数值存储方式
- 二进制和补码的换算
- 有符号类型的最小负数的补码的由来