Java SE笔记: 原码反码补码

计算机中的符号数有三种表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。
原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。
此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

正数的原码、反码、补码都相同。

  • 原码:就是二进制表示,最高位为符号位,0表示正,1表示负
  • 反码:负数的反码,就是逐位取反(符号位除外)
  • 补码:负数的补码,反码末位加1.

正数5:

1
2
3
4
二进制:00000101
原码:00000101
反码:00000101
补码:00000101

负数5:
1
2
3
4
二进制:10000101
原码:10000101
反码:11111010
补码:11111011

计算: 2-1
1
2
3
4
5
6
7
8
9
2-1 = 2 + (-1)
2 000000100000001000000010
-1 100000011111111011111111
负数的补码求原始数据步骤:1. -12. 取反3. 符号位改为1
1111111111111110
2
00000010
-1 11111111
00000001

计算:2-3 = 2 + (-3) = -1
1
2
3
2 000000100000001000000010
-3100000111111110011111101
2 00000010-3 11111101 11111111

-128是人为规定的。
因为8位2进制中,存在 “-0”(1000 0000)和”0”(0000 0000),虽然“-0”也是“0”,但根据正、反、补码体系,“-0”的补码和“+0”是不同的,这样就出现两个补码代表一个数值的情况。为了将补码与数字一一对应,所以人为规定“0”一律用“+0”代表。同时为了充分利用资源,就将原来本应该表示“-0”的补码规定为代表-128。
验证 1000 0000 到底是0还是-128,先假设为X
则 2+X=?
0000 0010
1000 0000
1000 0010 –> 1000 0001 –> 0111 1110
即为正负126
所以X=-128或X=124,显然应该取负数解!

文章目录