当前位置:首页计算机基础与编程环境 > 正文

数据编码:原码、反码、补码- 野牛程序员讲少儿编程

作者:野牛程序员: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

🔍 原码、反码、补码图解对比

十进制原码(二进制)反码(二进制)补码(二进制)
+50000 01010000 01010000 0101
-51000 01011111 10101111 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;
}

🎓 课堂思考题

  1. 原码、反码、补码谁能唯一表示 0?

  2. 为什么补码更适合做加减法?

  3. 反码最大的问题是什么?

  4. 请用补码计算:6 - 9


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • 数据编码:原码、反码、补码- 野牛程序员讲少儿编程
  • 相关推荐

    最新推荐

    热门点击