数据的表示
数据表示的相关基本
- 核心前提:计算机内部用二进制表示数据,外部信息(数值、字符、音视频等)需转二进制存入寄存器 / 存储器
- 数值数据分类:
- 无符号数:无正负,可表存储地址(如门牌号)
- 有符号数:含正负,分定点数(整数 / 纯小数,小数点固定)、浮点数(带小数,小数点可移)
- 关键概念:
- 机器码:含原码、补码、反码、移码,是数值的计算机编码形式
- 真值:日常生活中使用的数值(如 - 8.25)
- 表示格式:
- 无符号数:N 位全表数值,B₀(最低位)-Bₙ₋₁(最高位)
- 定点数:最高位为符号位,数值位取值依赖真值与编码格式
- 浮点数:单精度(32 位:1 符 + 8 阶 + 23 尾)、双精度(64 位:1 符 + 11 阶 + 52 尾),遵循 IEEE 754 标准(阶码移码、尾数原码)
| 分类维度 | 具体类型 | 关键特征 |
|---|---|---|
| 有无符号 | 无符号数 | 无正负,全位表数值;可作存储单元地址(如门牌号) |
| 有符号数 | 含正负,分定点数、浮点数两类 | |
| 小数点位置 | 定点数(有符号) | 小数点位置固定隐含,无需存储;分定点整数(小数点在数值位右侧)、定点小数(小数点在符号位与数值位之间) |
| 浮点数(有符号) | 小数点位置可移动(如 - 8.25 与 - 82.5);含单精度(32 位)、双精度(64 位) | |
| 计算机内部表示 | 机器码(机器数) | 无符号数 / 有符号数的二进制编码形式;有符号数编码含原码、补码、反码、移码(定点小数不用移码) |
| 日常数值 | 真值 | 日常生活中熟悉的数值形式(如 123、-0.6875),需转机器码才能被计算机处理 |
不同类型数据的存储格式
- 无符号数:N 位全表数值,B₀(最低位)~Bₙ₋₁(最高位),编码仅需进制转换。
- 定点数:最高位为符号位(表正负),剩余为数值位;定点整数小数点隐含在数值位右侧,定点小数隐含在符号位与数值位之间。
- 浮点数:
- 单精度(32 位):1 位符号位 + 8 位阶码(定点整数) + 23 位尾数(定点小数)
- 双精度(64 位):1 位符号位 + 11 位阶码(定点整数) + 52 位尾数(定点小数)
- 遵循 IEEE 754 标准:阶码用移码,尾数用原码。
常用进位计数制
| 进制 | 用途 | 基数 | 数码 | 进位规则 |
|---|---|---|---|---|
| 十进制 | 日常生活 | 10 | 0-9 | 逢十进一 |
| 二进制 | 计算机内部数据表示 | 2 | 0-1 | 逢二进一(因逻辑电路仅两状态) |
| 八进制 | 计算机外部(方便书写阅读) | 8 | 0-7 | 逢八进一 |
| 16 进制 | 计算机外部(解决二进制过长问题) | 16 | 0-9、A-F(对应 10-15) | 逢十六进一 |
| 其他 | 12/24/60 进制(时间相关) | - | - | - |
进制书写表示方法
- 括号 + 右下角标基数:如 (123)₁₀、(101)₂
- 英文首字母后缀(不区分大小写,常用大写):如 123D、101B、77O、A8H
- C 语言表示:十进制无修饰,二进制前缀 0B,八进制前缀 0,16 进制前缀 0X(B/X 常用小写)
进制转换方法
(一)非十进制→十进制:安全展开法
- 公式:任意进制数 = 各数位数码 × 基数 ^ 数位权值之和
- 示例:二进制 1011.101=1×2³+0×2²+1×2¹+1×2⁰+1×2⁻¹+0×2⁻²+1×2⁻³=11.625₁₀;16 进制 A9D1.cf 需先将 A-F 转 10-15 再计算
(二)二进制↔八进制 / 16 进制:分组对应法
| 转换方向 | 核心规则 | 分组方式 |
|---|---|---|
| 二进制→八进制 | 1 位八进制 = 3 位二进制 | 整数:低位→高位每 3 位分组,高位不足补 0;小数:高位→低位每 3 位分组,低位不足补 0 |
| 二进制→16 进制 | 1 位 16 进制 = 4 位二进制 | 整数:低位→高位每 4 位分组,高位不足补 0;小数:高位→低位每 4 位分组,低位不足补 0 |
| 八进制 / 16 进制→二进制 | 1 位八进制转 3 位二进制,1 位 16 进制转 4 位二进制 | 直接转换,去除整数最高位 / 小数最低位无效 0 |
| 八进制↔16 进制 | 以二进制为桥梁转换 | 八进制→二进制→16 进制,反之亦然 |
(三)十进制→任意进制:除基取余(整数)+ 乘基取整(小数)
- 整数部分(除基取余):十进制整数 ÷ 目标基数,取余数,商继续除基取余,直至商为 0,余数从下到上排列(低位先得)
- 小数部分(乘基取整):十进制小数 × 目标基数,取整数部分,剩余小数继续乘基取整,直至小数为 0 或达指定精度,整数从上到下排列(高位先得)
- 注意:小数转换可能精度缺失(无限循环),达所需精度即可
- 示例:123₁₀→二进制(除 2 取余)得 1111011;0.6875₁₀→二进制(乘 2 取整)得 0.1011
(四)十进制整数→二进制:凑值法(快捷)
- 前提:熟记 2 的幂次(至少 128、64、32、16、8、4、2、1)
- 方法:用 2 的幂次相加凑目标数,对应位为 1,其余为 0。示例:166=128+32+4+2→10100110₂
原码、补码、反码、移码
核心定义(8 位为例,1 位符号位 + 7 位数值位)
-
原码
符号位(0 正 1 负)+ 数值绝对值
- 例:+5→00000101,-5→10000101;正负零不唯一(+0=00000000,-0=10000000)
-
反码
符号位同原码,正数数值位不变,负数数值位取反
- 例:+5→00000101,-5→11111010;正负零不唯一
-
补码
正数同原码 / 反码,负数 = 反码 + 1(进位传递)
- 例:+5→00000101,-5→11111011;正负零唯一(0=00000000),支持减法转加法
-
移码:真值 + 偏移量(8 位取 128),映射为非负数方便比较
- 例:+5→10000101(5+128),-5→01111011(-5+128);符号位与补码相反,范围 - 128~+127,用于浮点数阶码。
转换逻辑
- 正数:原码 = 反码 = 补码
- 负数:
原码→补码:原码→反码→+1
补码→原码:补码→反码→+1
前置知识:定点数表示复习
- 定点小数定义:机器字长为 N+1 位(1 位符号位 + N 位数值位),小数点固定在符号位与数值位之间(无需记录),仅用于表示浮点数尾数,无对应高级语言数据类型。例如:若机器字长为 4 位(1 位符号位 + 3 位数值位),则定点小数格式为 “符号位。数值位 1 数值位 2 数值位 3”,如 “0.101” 表示 + 0.625。
- 定点数编码特性
- 补码、移码比原码、反码多表示 1 个最小负数。例如:8 位二进制中,原码 / 反码最小负数为 - 127(11111111),补码最小负数为 - 128(10000000),移码最小负数为 00000000(对应真值 - 128)。
- 表示范围由 “机器字长 + 机器码类型” 决定:字长越长、用补码 / 移码时,范围越广。
32 位浮点数(单精度)的存储结构
整体占 4 字节(32 位),按 “符号位→阶码→尾数” 的顺序拼接,位数分配如下:
| 组件 | 位数 | 作用与编码规则 |
|---|---|---|
| 符号位(S) | 1 位 | 0 = 正数,1 = 负数(直接存储,无额外编码) |
| 阶码(E) | 8 位 | 用 “偏移码” 存储(避免存负数阶码,简化运算),偏移量固定为 127(即:存储值 = 真实阶码 + 127) |
| 尾数(M) | 23 位 | 存储 “标准化尾数 1.xxxx” 中 “xxxx” 的部分(因 “1.” 固定,不存,仅存 23 位有效位,不足补 0) |
2. 32 位存储的完整实例:存 “6.5”
结合前面 “6.5” 的标准化结果(S=0,真实阶码 E=2,尾数有效位 M=101),按步骤编码存储:
步骤 1:编码符号位(S)
6.5 是正数,S=0(直接存 “0”)。
步骤 2:编码阶码(E)
- 真实阶码 E=2;
- 按 32 位规则,偏移量 = 127,所以 “阶码存储值”=2+127=129;
- 将 129 转 8 位二进制:129 是 “10000001B”(这就是最终存在 8 位阶码区的值)。
步骤 3:编码尾数(M)
- 标准化尾数是 “1.101B”,需存 “101” 部分;
- 32 位尾数区需 23 位,不足补 0,所以 M 的存储值是 “10100000000000000000000B”(“101” 后补 20 个 0,凑够 23 位)。
步骤 4:拼接 32 位二进制串
按 “S→E→M” 顺序拼接:
0(S) + 10000001(E) + 10100000000000000000000(M) = 01000000110100000000000000000000B
这串二进制就是 “6.5” 在内存中 32 位浮点数的存储形式(转十六进制为0x40D00000,可通过编程验证)。
浮点数表示范围(以 “3 位阶码 + 3 位尾数” 为例,均用原码)
- 阶码:1 位阶符 + 2 位数值位,范围为 - 2~+2(阶符 0 为正、1 为负,数值位全 1 时最大,如 “011” 表示 + 2,“111” 表示 - 2);
- 尾数:1 位数符 + 2 位数值位,范围为 - 0.75~+0.75(数符 0 为正、1 为负,数值位全 1 时最大,如 “011” 表示 + 0.75,“111” 表示 - 0.75);
- 各范围计算:
- 正最大值:
R^E_max × M_max = 2^2 × 0.75 = 3.0; - 正最小值:
R^E_min(正) × M_min(正) = 2^(-2) × 0.25 = 0.0625; - 负最小值:
R^E_max × M_min(负) = 2^2 × (-0.75) = -3.0; - 负最大值:
R^E_min(正) × M_max(负) = 2^(-2) × (-0.25) = -0.0625。
- 正最大值:
浮点数溢出问题
- 上溢:阶码>最大阶码(如上述例子中阶码为 + 3),数值超范围,机器停止运算并显溢出标志。例如:
2^3 × 0.5,因阶码 + 3 超出 “-2~+2” 范围,触发上溢。 - 下溢:阶码<最小阶码(如上述例子中阶码为 - 3),数值接近 0,机器按 “机器零” 处理(可继续运行)。例如:
2^(-3) × 0.5,阶码 - 3 超出范围,按 0 处理。 - 精度溢出:数值在范围之内,但无法精确表示(因尾数是二进制定点小数)。例如:十进制 0.1 转换为二进制是
0.000110011…(无限循环),存储时需截断,导致精度损失。
核心习题与答案
- 二进制浮点数的机器表示由哪两部分构成?答案:基数隐含,由阶码和尾数构成(如
2^3 × 0.101,机器存储 “3” 和 “0.101”)。 - 浮点数的表示范围和精度分别由什么决定?答案:阶码位数决定范围(如 8 位阶码比 6 位阶码范围广),尾数位数决定精度(如 24 位尾数比 16 位尾数精度高)。
- 已知阶码 3 位(1 阶符 + 2 数值位)、尾数 3 位(1 数符 + 2 数值位),均为原码,求最大正数?答案:
2^(+2) × 0.75 = 3.0。
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自木鱼的鱼窝



