Skip to content

L3_01 数据编码

一、原码

1.1 定义

原码是一种简单的表示方法,最高位表示符号位,其余位表示数值。

1.2 表示方法

  • 正数:符号位为 0
  • 负数:符号位为 1

1.3 示例

+5 的原码:0000 0101
-5 的原码:1000 0101

1.4 范围(8位)

  • 正数:0000 0000 ~ 0111 1111(0 ~ +127)
  • 负数:1000 0000 ~ 1111 1111(-0 ~ -127)

1.5 缺点

  • 存在 +0 和 -0 两种表示
  • 减法运算复杂

二、反码

2.1 定义

反码是原码的一种变形,用于简化减法运算。

2.2 计算方法

  • 正数:反码 = 原码
  • 负数:反码 = 原码除符号位外取反

2.3 示例

+5 的反码:0000 0101(与原码相同)
-5 的反码:1111 1010(原码除符号位外取反)

2.4 运算规则

[X + Y]反 = [X]反 + [Y]反(模 2^n)

三、补码

3.1 定义

补码是计算机中最常用的表示方法,统一了加减法运算。

3.2 计算方法

  • 正数:补码 = 原码
  • 负数:补码 = 反码 + 1(模 2^n)

3.3 示例

+5 的补码:0000 0101(与原码相同)
-5 的补码:1111 1011(反码 + 1)

3.4 范围(8位)

  • 正数:0000 0000 ~ 0111 1111(0 ~ +127)
  • 负数:1000 0000 ~ 1111 1111(-128 ~ -1)

3.5 补码的优势

  • 只有一个 0 的表示
  • 加减法可以统一为加法运算

四、编码转换示例

4.1 正数转换

十进制:+10
原码:0000 1010
反码:0000 1010
补码:0000 1010

4.2 负数转换

十进制:-10
原码:1000 1010
反码:1111 0101
补码:1111 0110

4.3 补码转十进制

补码:1111 0110
反码:1111 0101(补码 - 1)
原码:1000 1010(除符号位取反)
十进制:-10

五、补码运算

5.1 加法运算

3 + (-5) = ?

[3]补 = 0000 0011
[-5]补 = 1111 1011
[3 + (-5)]补 = 0000 0011 + 1111 1011 = 1111 1110

结果补码:1111 1110 → 原码:1000 0010 → 十进制:-2

5.2 减法运算

3 - 5 = 3 + (-5) = ?

[3]补 = 0000 0011
[-5]补 = 1111 1011
[3 - 5]补 = 0000 0011 + 1111 1011 = 1111 1110

结果:-2

六、示例程序

6.1 补码计算

cpp
#include <iostream>
using namespace std;

int main() {
    int a = 3;
    int b = -5;
    
    // 在计算机中,负数以补码形式存储
    int result = a + b;
    cout << "3 + (-5) = " << result << endl;
    
    // 查看补码表示
    unsigned int mask = 0xFF;
    cout << "3 的补码: " << (a & mask) << endl;
    cout << "-5 的补码: " << (b & mask) << endl;
    cout << "结果的补码: " << (result & mask) << endl;
    
    return 0;
}

百炼成钢,融会贯通