计算机基础-补码

计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同 。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理

  • 正整数的补码是其二进制表示,与原码相同
  • 负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1
  • 已知一个数的补码,求原码的操作其实就是对该补码再求补码
int8 原码 补码 补码再补码
1 0000 0001 0000 0001 0000 0001
2 0000 0010 0000 0010 0000 0010
-1 1000 0001 1111 1111 1000 0001
-2 1000 0010 1111 1110 1000 0010

如果 -1 的补码 1111 1111 被当做 uint8 类型读取时, 求得原码 1111 1111 = 2^8 -1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1 + 2
0000 0001 + 
0000 0010 =
0000 0011 >补码>
0000 0011 = 3

# 1 - 2 = 1 + (-2) 
0000 0001 + 
1111 1110 =
1111 1111 >补码>
1000 0001 = -1

# 2 - 1
0000 0010 + 
1111 1111 =
0000 0001 >补码> # 进位被丢失
0000 0001 = 1

# 1 - 1
0000 0001 +
1111 1111 = 
0000 0000 >补码> # 进位被丢失
0000 0000 = 0