二进制、原码、反码、补码详解(含计算公式与案例)
在计算机中,数值通常以 二进制补码(Two’s Complement) 存储,但在此之前,我们需要理解 原码、反码、补码 的概念及其转换关系。
1. 基本概念
(1) 二进制(Binary)
计算机使用 二进制(0 和 1) 存储数据,每一位称为 bit,8 bit = 1 byte。
(2) 原码(True Form)
- 最高位表示符号(
0
为正,1
为负) - 其余位表示数值的绝对值
- 示例:
+5
的原码:00000101
-5
的原码:10000101
(3) 反码(Ones’ Complement)
- 正数的反码 = 原码
- 负数的反码 = 原码符号位不变,其余位取反
- 示例:
+5
的反码:00000101
(与原码相同)-5
的反码:11111010
(符号位不变,其余取反)
(4) 补码(Two’s Complement)
- 正数的补码 = 原码
- 负数的补码 = 反码 + 1
- 示例:
+5
的补码:00000101
(与原码相同)-5
的补码:11111011
(反码11111010
+1
)
2. 计算公式
(1) 原码 → 反码
数值 | 规则 |
---|---|
正数 | 反码 = 原码 |
负数 | 反码 = 符号位不变,其余位取反 |
(2) 反码 → 补码
数值 | 规则 |
---|---|
正数 | 补码 = 反码 = 原码 |
负数 | 补码 = 反码 + 1 |
(3) 补码 → 原码
数值 | 规则 |
---|---|
正数 | 原码 = 补码 |
负数 | 原码 = 补码取反 + 1(即补码的补码) |
3. 计算案例
案例 1:计算 -6
的原码、反码、补码
- 原码:
-6
是负数,符号位1
6
的二进制:0000110
- 原码:
10000110
(1
表示负,0000110
是6
)
- 反码:
- 符号位不变,其余取反:
10000110
→11111001
- 补码:
- 反码
11111001
+1
=11111010
- 反码
最终结果:
表示法 | 二进制 |
---|---|
原码 | 10000110 |
反码 | 11111001 |
补码 | 11111010 |
案例 2:计算补码 10101010
对应的十进制值
- 判断符号:
- 最高位
1
→ 负数
- 最高位
- 补码 → 反码:
- 补码
10101010
-1
=10101001
- 补码
- 反码 → 原码:
- 符号位不变,其余取反:
10101001
→11010110
- 计算数值:
- 原码
11010110
→- (1×64 + 0×32 + 1×16 + 0×8 + 1×4 + 1×2 + 0×1) = -86
- 原码
最终结果:
10101010
(补码) =-86
(十进制)
案例 3:byte
类型的 -128
为什么是 10000000
?
byte
是 8 位补码表示,范围-128
~127
127
=01111111
-128
的计算:128
的二进制:10000000
- 补码表示
-128
:- 没有
+128
(因为byte
最大正数是127
) 10000000
直接表示-128
(补码规则)
- 没有
4. 为什么计算机使用补码?
- 统一
+0
和-0
:- 原码:
+0
=00000000
,-0
=10000000
(浪费一个编码) - 补码:
0
=00000000
,-128
=10000000
(无-0
)
- 原码:
- 简化运算:
- 减法可以转换为加法(
A - B
=A + (-B)
) - 例如:
5 - 3
=5 + (-3)
:5
的补码:00000101
-3
的补码:11111101
- 相加:
00000101 + 11111101 = 00000010
(2
,正确)
- 减法可以转换为加法(
- 硬件实现简单:
- 不需要额外的减法电路,只需加法器。
5. 总结
表示法 | 正数 | 负数 |
---|---|---|
原码 | 符号位 0 + 数值 | 符号位 1 + 数值 |
反码 | 与原码相同 | 符号位不变,其余取反 |
补码 | 与原码相同 | 反码 + 1 |
关键点:
- 计算机存储整数用补码(简化运算,避免
-0
) byte
范围-128
~127
(10000000
表示-128
)- 补码转十进制:
- 正数:直接计算
- 负数:补码 → 反码 → 原码 → 计算绝对值并加负号
掌握这些概念,能更好地理解计算机如何处理 有符号整数! 🚀