Appearance
L3_01 数据编码
一、原码
1.1 定义
原码是一种简单的表示方法,最高位表示符号位,其余位表示数值。
1.2 表示方法
- 正数:符号位为 0
- 负数:符号位为 1
1.3 示例
+5 的原码:0000 0101
-5 的原码:1000 01011.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 10104.2 负数转换
十进制:-10
原码:1000 1010
反码:1111 0101
补码:1111 01104.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 → 十进制:-25.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;
}