《原码、反码、补码表示与运算》详解
《原码、反码、补码表示与运算》详解
一、关键知识点
1. 原码(Sign-Magnitude)
- 定义:最高位为符号位(0 表示正,1 表示负),其余位表示数值的绝对值。
- 优点:直观,便于人类理解
- 缺点:
- 零有两种表示形式(+0 和 -0)
- 加减法需要额外判断符号和大小,不适合计算机直接进行运算
示例(4位)
+5 → 0101
-5 → 1101
+0 → 0000
-0 → 1000
2. 反码(Ones' Complement)
- 定义:
- 正数与原码相同
- 负数是其对应正数的各位取反(包括符号位)
- 优点:可以实现加法器统一处理正负数
- 缺点:同样存在“+0”和“-0”的问题
示例(4位)
+5 → 0101
-5 → 1010 (将 0101 每位取反得到)
+0 → 0000
-0 → 1111
3. 补码(Two's Complement)
- 定义:
- 正数与原码相同
- 负数是其对应正数的反码 + 1
- 优点:
- 零有唯一表示
- 简化了加减法运算(统一使用加法器)
- 是现代计算机系统中标准使用的整数表示方法
示例(4位)
+5 → 0101
-5 → 1011 (先取反码 1010,再加1)
+0 → 0000
-0 → 0000 (补码自动归零)
二、经典示例解析
示例 1:求 -6 的 8位补码表示
步骤:
- 先写出 +6 的二进制:
0000 0110 - 取反:
1111 1001 - 加1:
1111 1010
✅ 所以 -6 的 8位补码是:11111010
示例 2:补码加法计算 5 + (-3)
5 的补码: 0000 0101
-3 的补码: 1111 1101
相加:
0000 0101
+ 1111 1101
= (1)0000 0010 ← 最高位溢出被舍弃
结果:0000 0010 → 即十进制的 2 ✅ 正确!
三、学习技巧
| 技巧 | 描述 |
|---|---|
| 口诀记忆法 | “原码看符号,反码全取反,补码反加一” |
| 图形辅助 | 绘制补码数轴图,帮助理解正负数范围 |
| 实践验证 | 使用调试器查看变量在内存中的实际补码表示 |
| 编程练习 | 用 C/C++ 或 Python 实现补码转换函数 |
| 模拟电路 | 在 Logisim 中搭建简单加法器,观察补码运算过程 |
四、注意提醒
| 注意点 | 说明 |
|---|---|
| 不要混淆原码与补码的加法规则 | 原码不能直接相加,必须先转为补码 |
| 补码能表示的范围不对称 | n位补码可表示范围:-2^(n-1) ~ 2^(n-1)-1 |
| 补码运算溢出要特别关注 | 若两个正数相加结果为负,或两个负数相加结果为正,则发生溢出 |
| Windows调试器默认显示补码 | 查看寄存器/内存中的整数时,是以补码形式呈现的 |
| 字符类型也有补码表示 | char 类型在C语言中是有符号的,默认使用补码存储 |
五、Windows平台实践建议
-
使用 Visual Studio 调试器:
- 定义
int a = -5;,打开内存窗口查看其十六进制表示 - 观察寄存器中
-1的补码表示(全F)
- 定义
-
使用计算器(程序员模式):
- 输入负数,切换到二进制视图,观察其补码表示
-
编写小工具程序(如Python):
def int_to_twos_complement(n, bits): return bin(n & int('1'*bits, 2))[2:].zfill(bits) print(int_to_twos_complement(-5, 8)) # 输出:11111011
总结
| 内容 | 特点 |
|---|---|
| 原码 | 直观但不实用 |
| 反码 | 过渡形式,已淘汰 |
| 补码 | 现代计算机唯一采用方式 |
| 推荐重点 | 理解补码原理与运算规则,掌握如何手动计算、调试验证 |
如果你希望继续深入学习以下内容,请告诉我:
- 📌 补码的溢出检测方法
- 🧠 补码在 ALU(算术逻辑单元)中的应用
- 🛠️ 如何用 Logisim 搭建一个简单的补码加法器
- 💡 IEEE 浮点数表示是否也使用补码?为什么?
欢迎随时选择下一步学习内容!

浙公网安备 33010602011771号