原码补码反码

梦想不会自己发光,真正闪耀的是那个为梦狂奔的你。献给知行的孩子们!(Eric.He著)


  本教程将从机器数与真值的基础概念出发,全面讲解数的原码、补码、反码表示方法,以及定点表示和浮点表示的核心原理,帮助你掌握计算机底层数值存储的核心逻辑。

教程目录导航

一、机器数与真值核心概述

1.1 机器数的定义与特性

计算机中,机器数是指将数字的符号(正/负)和数值部分一起编码后,存储在计算机中的二进制数。其核心特性:

示例:8位机器数表示十进制数+5和-5

符号位(最高位)+ 数值位(后7位):

+5 的机器数(原码):0000 0101

-5 的机器数(原码):1000 0101

1.2 真值的概念

真值是指数字本身的实际值,即带符号的十进制数(或其他进制数),是人类可直接理解的数值形式,未经过计算机编码处理。

示例:常见真值与机器数的对应

真值 8位机器数(原码) 8位机器数(补码)
+10 0000 1010 0000 1010
-10 1000 1010 1111 0110
+0 0000 0000 0000 0000
-0 1000 0000 0000 0000(补码中0唯一)

1.3 机器数与真值的对应关系

机器数是真值在计算机中的编码形式,二者是“存储形式”与“实际值”的关系:

注意:计算机底层不直接存储真值,所有数值运算都是基于机器数(补码)完成的,运算结果再解码为真值供人类读取。

二、数的原码、补码和反码表示

2.1 原码:最直观的表示方法

原码是最简单的机器数编码方式,直接将真值的符号和数值部分转换为二进制:

编码规则:

示例:8位原码计算


// 正数原码:符号位0 + 数值位
真值 +7 → 原码:0000 0111
真值 +127 → 原码:0111 1111

// 负数原码:符号位1 + 数值位(绝对值)
真值 -7 → 原码:1000 0111
真值 -127 → 原码:1111 1111

// 0的原码(有两种表示)
真值 +0 → 原码:0000 0000
真值 -0 → 原码:1000 0000
        

原码的优缺点:

2.2 反码:过渡型编码方式

反码是原码到补码的过渡编码,解决了原码加减法的部分问题:

编码规则:

示例:8位反码计算


// 正数反码(与原码一致)
真值 +7 → 原码:0000 0111 → 反码:0000 0111
真值 +127 → 原码:0111 1111 → 反码:0111 1111

// 负数反码(数值位取反)
真值 -7 → 原码:1000 0111 → 反码:1111 1000
真值 -127 → 原码:1111 1111 → 反码:1000 0000

// 0的反码(有两种表示)
真值 +0 → 反码:0000 0000
真值 -0 → 反码:1111 1111
        

反码的优缺点:

2.3 补码:计算机的核心存储编码

补码是计算机实际存储和运算的编码方式,彻底解决了原码/反码的缺陷:

编码规则:

示例:8位补码计算


// 正数补码(与原码/反码一致)
真值 +7 → 原码:0000 0111 → 反码:0000 0111 → 补码:0000 0111
真值 +127 → 原码:0111 1111 → 反码:0111 1111 → 补码:0111 1111

// 负数补码(反码+1)
真值 -7 → 原码:1000 0111 → 反码:1111 1000 → 补码:1111 1001
真值 -128 → 补码:1000 0000(8位补码特殊值,无原码/反码对应)

// 0的补码(唯一)
真值 +0/-0 → 补码:0000 0000
        

补码的核心优势:

示例:补码实现减法(7 - 5 = 2)


// 转换为补码加法:7 + (-5)
+7 的补码:0000 0111
-5 的补码:1111 1011

// 补码相加(忽略最高位进位)
  0000 0111
+ 1111 1011
=1 0000 0010 → 舍弃进位 → 0000 0010(补码)

// 补码转真值:0000 0010 → +2(结果正确)
            

2.4 三种编码的相互转换

转换方向 转换规则 8位示例(以-7为例)
真值 → 原码 符号位+数值位(绝对值) -7 → 1000 0111
原码 → 反码 正数:不变;负数:符号位不变,数值位取反 1000 0111 → 1111 1000
反码 → 补码 正数:不变;负数:反码+1 1111 1000 → 1111 1001
补码 → 原码 正数:不变;负数:补码-1后数值位取反,符号位不变 1111 1001 → 1000 0111

核心口诀:正数三码合一;负数反码取反、补码取反加一;补码转原码,负数先减一再取反(或直接取反加一,结果一致)。

三、数的定点表示和浮点表示

3.1 定点表示:小数点位置固定

定点表示是指在机器数中,小数点的位置固定不变的数值表示方法,分为定点整数和定点小数:

1. 定点整数

2. 定点小数

定点表示的优缺点:

3.2 浮点表示:小数点位置浮动

浮点表示是指小数点位置可浮动的数值表示方法,借鉴科学计数法,分为符号位、阶码、尾数三部分:

1. 基本格式(IEEE 754标准)


// 32位单精度浮点数(float)
1位符号位(S) + 8位阶码(E) + 23位尾数(M)

// 64位双精度浮点数(double)
1位符号位(S) + 11位阶码(E) + 52位尾数(M)

// 数值计算公式
N = (-1)^S × (1.M) × 2^(E-偏移量)
// 单精度偏移量:127;双精度偏移量:1023
        

2. 各部分含义

示例:32位单精度浮点数表示+0.5


// 步骤1:将0.5转换为二进制科学计数法
0.5 = 1.0 × 2^(-1)

// 步骤2:拆分各部分
符号位(S):0(正数)
阶码(E):-1 + 127 = 126 → 二进制:0111 1110
尾数(M):0(1.0的小数部分为0)

// 最终32位浮点数
0 01111110 00000000000000000000000
        

浮点表示的优缺点:

3.3 定点与浮点表示的对比

对比维度 定点表示 浮点表示
小数点位置 固定(隐含) 浮动(由阶码决定)
表示范围 小(受字长限制) 大(阶码扩展范围)
精度 固定,易浪费 可变,精度更高
运算复杂度 简单(仅加减乘除) 复杂(需处理阶码、尾数)
硬件实现 简单,成本低 复杂,成本高
适用场景 嵌入式系统、简单计算 通用计算机、科学计算、大数据处理

四、典型应用场景

五、注意事项

六、总结

本教程从机器数与真值的基础出发,系统讲解了原码、补码、反码的编码规则和转换方法,以及定点/浮点表示的核心原理。掌握这些知识,是理解计算机底层数值处理的关键,也是学习计算机组成原理、操作系统、编译器的重要基础。


返回顶部