数据编码:原码、反码、补码- 野牛程序员讲少儿编程
作者:野牛程序员:2025-05-10 07:37:07计算机基础与编程环境阅读 2380
数据编码:原码、反码、补码- 野牛程序员讲少儿编程
? 什么是数据编码?
计算机只能处理二进制(0 和 1),那怎么让计算机理解“正数”和“负数”呢?
这就需要用一种方法把正负数变成二进制。常见的有三种:
| 编码方式 | 英文名 | 说明 |
|---|---|---|
| 原码 | Sign-Magnitude | 直接表示正负,最高位表示符号 |
| 反码 | Ones' Complement | 正数不变,负数按位取反(符号位不变) |
| 补码 | Two's Complement | 正数不变,负数:反码 + 1 |
✍ 先看二进制基础
假设只用 8 位二进制 表示数字(也叫 1 个字节):
最高位是符号位:
0表示正数,1表示负数剩下的 7 位表示数值
比如:
十进制 5 -> 二进制原码:0000 0101 十进制 -5 -> 原码:1000 0101 -> 反码:1111 1010 -> 补码:1111 1011
? 原码、反码、补码图解对比
| 十进制 | 原码(二进制) | 反码(二进制) | 补码(二进制) |
|---|---|---|---|
| +5 | 0000 0101 | 0000 0101 | 0000 0101 |
| -5 | 1000 0101 | 1111 1010 | 1111 1011 |
备注:
正数三种编码都一样
负数才有区别,且补码 = 反码 + 1
? 为什么要用“补码”?
计算机中只有加法器,所以减法也要变成加法来算:
例如:
7 - 5 = 7 + (-5)
用补码可以这样做(8位):
7 -> 补码:0000 0111 -5 -> 补码:1111 1011 相加结果:0000 0010(= 2,正确!)
? 使用“补码”可以直接用加法器处理所有加减运算!
? 小口诀记忆:
| 编码 | 口诀 |
|---|---|
| 原码 | 符号在前数在后,正负都照抄 |
| 反码 | 负数符号不变,数值按位反 |
| 补码 | 反码再加 1,计算全靠它 |
? C++示例演示(含注释)
#include <iostream>
#include <bitset>
using namespace std;
// 功能:展示一个数的原码、反码、补码(二进制形式)
void showEncoding(int x) {
bitset<8> raw(x); // 补码显示(C++ 默认)
cout << "十进制:" << x << endl;
cout << "二进制(补码):" << raw << endl;
if (x < 0) {
int absx = -x;
bitset<8> yuan(0b10000000 | absx); // 原码:符号位1 + 正数位
bitset<8> fan(~absx | 0b10000000); // 反码:取反 + 符号位1
cout << "原码:" << yuan << endl;
cout << "反码:" << fan << endl;
cout << "补码:" << raw << endl;
} else {
bitset<8> yuan(x); // 原码 = 正数二进制
cout << "原码/反码/补码(正数都一样):" << yuan << endl;
}
cout << "--------------------------" << endl;
}
int main() {
showEncoding(5);
showEncoding(-5);
showEncoding(7);
showEncoding(-7);
return 0;
}? 课堂思考题
原码、反码、补码谁能唯一表示 0?
为什么补码更适合做加减法?
反码最大的问题是什么?
请用补码计算:
6 - 9
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

