数据编码:原码、反码、补码- 野牛程序员讲少儿编程
作者:野牛程序员:2025-05-10 07:37:07计算机基础与编程环境阅读 1988
数据编码:原码、反码、补码- 野牛程序员讲少儿编程
📘 什么是数据编码?
计算机只能处理二进制(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
