数据表示的相关基本

  1. 核心前提:计算机内部用二进制表示数据,外部信息(数值、字符、音视频等)需转二进制存入寄存器 / 存储器
  2. 数值数据分类
    • 无符号数:无正负,可表存储地址(如门牌号)
    • 有符号数:含正负,分定点数(整数 / 纯小数,小数点固定)、浮点数(带小数,小数点可移)
  3. 关键概念
    • 机器码:含原码、补码、反码、移码,是数值的计算机编码形式
    • 真值:日常生活中使用的数值(如 - 8.25)
  4. 表示格式
    • 无符号数:N 位全表数值,B₀(最低位)-Bₙ₋₁(最高位)
    • 定点数:最高位为符号位,数值位取值依赖真值与编码格式
    • 浮点数:单精度(32 位:1 符 + 8 阶 + 23 尾)、双精度(64 位:1 符 + 11 阶 + 52 尾),遵循 IEEE 754 标准(阶码移码、尾数原码)
分类维度 具体类型 关键特征
有无符号 无符号数 无正负,全位表数值;可作存储单元地址(如门牌号)
有符号数 含正负,分定点数、浮点数两类
小数点位置 定点数(有符号) 小数点位置固定隐含,无需存储;分定点整数(小数点在数值位右侧)、定点小数(小数点在符号位与数值位之间)
浮点数(有符号) 小数点位置可移动(如 - 8.25 与 - 82.5);含单精度(32 位)、双精度(64 位)
计算机内部表示 机器码(机器数) 无符号数 / 有符号数的二进制编码形式;有符号数编码含原码、补码、反码、移码(定点小数不用移码)
日常数值 真值 日常生活中熟悉的数值形式(如 123、-0.6875),需转机器码才能被计算机处理

不同类型数据的存储格式

  1. 无符号数:N 位全表数值,B₀(最低位)~Bₙ₋₁(最高位),编码仅需进制转换。
  2. 定点数:最高位为符号位(表正负),剩余为数值位;定点整数小数点隐含在数值位右侧,定点小数隐含在符号位与数值位之间。
  3. 浮点数
    • 单精度(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 进制(时间相关) - - -

进制书写表示方法

  1. 括号 + 右下角标基数:如 (123)₁₀、(101)₂
  2. 英文首字母后缀(不区分大小写,常用大写):如 123D、101B、77O、A8H
  3. 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 进制,反之亦然

(三)十进制→任意进制:除基取余(整数)+ 乘基取整(小数)

  1. 整数部分(除基取余):十进制整数 ÷ 目标基数,取余数,商继续除基取余,直至商为 0,余数从下到上排列(低位先得)
  2. 小数部分(乘基取整):十进制小数 × 目标基数,取整数部分,剩余小数继续乘基取整,直至小数为 0 或达指定精度,整数从上到下排列(高位先得)
  3. 注意:小数转换可能精度缺失(无限循环),达所需精度即可
  4. 示例: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 位数值位)

  1. 原码

    符号位(0 正 1 负)+ 数值绝对值

    • 例:+5→00000101,-5→10000101;正负零不唯一(+0=00000000,-0=10000000)
  2. 反码

    符号位同原码,正数数值位不变,负数数值位取反

    • 例:+5→00000101,-5→11111010;正负零不唯一
  3. 补码

    正数同原码 / 反码,负数 = 反码 + 1(进位传递)

    • 例:+5→00000101,-5→11111011;正负零唯一(0=00000000),支持减法转加法
  4. 移码:真值 + 偏移量(8 位取 128),映射为非负数方便比较

    • 例:+5→10000101(5+128),-5→01111011(-5+128);符号位与补码相反,范围 - 128~+127,用于浮点数阶码。

转换逻辑

  • 正数:原码 = 反码 = 补码
  • 负数:
    原码→补码:原码→反码→+1
    补码→原码:补码→反码→+1

前置知识:定点数表示复习

  1. 定点小数定义:机器字长为 N+1 位(1 位符号位 + N 位数值位),小数点固定在符号位与数值位之间(无需记录),仅用于表示浮点数尾数,无对应高级语言数据类型。例如:若机器字长为 4 位(1 位符号位 + 3 位数值位),则定点小数格式为 “符号位。数值位 1 数值位 2 数值位 3”,如 “0.101” 表示 + 0.625。
  2. 定点数编码特性
    • 补码、移码比原码、反码多表示 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

浮点数溢出问题

  1. 上溢:阶码>最大阶码(如上述例子中阶码为 + 3),数值超范围,机器停止运算并显溢出标志。例如:2^3 × 0.5,因阶码 + 3 超出 “-2~+2” 范围,触发上溢。
  2. 下溢:阶码<最小阶码(如上述例子中阶码为 - 3),数值接近 0,机器按 “机器零” 处理(可继续运行)。例如:2^(-3) × 0.5,阶码 - 3 超出范围,按 0 处理。
  3. 精度溢出:数值在范围之内,但无法精确表示(因尾数是二进制定点小数)。例如:十进制 0.1 转换为二进制是0.000110011…(无限循环),存储时需截断,导致精度损失。

核心习题与答案

  1. 二进制浮点数的机器表示由哪两部分构成?答案:基数隐含,由阶码和尾数构成(如2^3 × 0.101,机器存储 “3” 和 “0.101”)。
  2. 浮点数的表示范围和精度分别由什么决定?答案:阶码位数决定范围(如 8 位阶码比 6 位阶码范围广),尾数位数决定精度(如 24 位尾数比 16 位尾数精度高)。
  3. 已知阶码 3 位(1 阶符 + 2 数值位)、尾数 3 位(1 数符 + 2 数值位),均为原码,求最大正数?答案:2^(+2) × 0.75 = 3.0

image-20251105214455215