《原码、反码、补码表示与运算》详解

《原码、反码、补码表示与运算》详解

《原码、反码、补码表示与运算》详解

一、关键知识点

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 浮点数表示是否也使用补码?为什么?

欢迎随时选择下一步学习内容!

相关创作