计算机组成原理笔记(五)——2.1数值数据的表示

在计算机中,采用数字化方式来表示数据,数据有无符号数和带符号数之分,其中带符号数根据其编码的不同又有原码、补码和反码3种表示形式。

2.1.1计算机中的数值数据

计算机中所有数据最终都以二进制形式存储。数值数据分为 无符号数带符号数,而带符号数有 原码、补码、反码 三种表示形式。以下分步骤详细说明:

一、无符号数(Unsigned)

定义:所有二进制位均为数值位,没有符号位。
表示范围

  • 8位二进制:0 ~ 255
  • 16位二进制:0 ~ 65535

用途:适用于仅处理非负数的场景(如地址运算、像素值)。

无符号数
纯数值
例如: 10011011B = 155

二、带符号数(Signed)

核心思想:最高位为符号位,0表示正,1表示负。数值位为剩余位。

1. 原码(True Form)

规则

  • 正数:符号位为0,数值部分为绝对值。
  • 负数:符号位为1,数值部分为绝对值。

缺点

  • +0(0000 0000)和 -0(1000 0000)存在两种表示,导致运算复杂。
  • 直接加减法需处理符号位,硬件设计复杂。

示例(8位):

  • +50000 0101
  • -51000 0101
2. 反码(One’s Complement)

规则

  • 正数:与原码相同。
  • 负数:符号位保持1,数值位逐位取反。

示例

  • -5 的反码 = 1111 1010
  • 缺点:仍然存在 +0(0000 0000)和 -0(1111 1111)。
3. 补码(Two’s Complement)

规则

  • 正数:与原码相同。
  • 负数:反码 + 1(忽略最高位溢出)。

优点

  • 解决±0问题,统一运算规则。
  • 实现加减法的统一处理。

示例(8位):

  • -5 的补码:

    原码: 1000 0101
    反码: 1111 1010
    补码: 1111 1011

三、进制转换

数值在计算机中存储前需转换为二进制,但编写代码时可写为十进制、八进制(前缀0)、十六进制(前缀0x)。

进制转换示例(十进制→二进制):

  • 27₁₀ → 11011₂

在这里插入图片描述

四、补码的加减法(关键!)

计算机通过补码统一加减法:

  • 加法:直接按位加,溢出位舍弃。
  • 减法A - B 转换为 A + (-B) 的补码加法。

示例(8位):

  • 5 - 3 = 5 + (-3)
    5 补码:0000 0101
    -3 补码:1111 1101

      0000 0101
    + 1111 1101
    ------------
      0000 0010 → 2₁₀(舍弃溢出)
    

总结

类型表示方法示例(8位,-5)
原码符号位 + 绝对值的二进制1000 0101
反码符号位不变,数值位取反1111 1010
补码反码 + 11111 1011

通过流程图和示例,可以清晰理解数值数据的存储与运算原理。补码机制是计算机高效处理负数的关键设计!

2.1.3原码表示法

原码是计算机中表示带符号数的最基本方法,适用于整数和小数。其核心特点是 符号位与数值位分离处理。以下是详细的实现规则、特点分析及流程图辅助说明:

一、原码定义

原码由 符号位 + 绝对值的二进制 构成,符号位为0表示正数,符号位为1表示负数。

1. 纯小数的原码

[ X ] 原 = { X 如果  0 ≤ X < 1 1 − X 如果  − 1 < X ≤ 0 [X]_{\text{原}} = \begin{cases} X & \text{如果 } 0 \le X < 1 \\ 1 - X & \text{如果 } -1 < X \le 0 \end{cases} [X]={X1X如果 0X<1如果 1<X0

  • 示例
    • X = + 0.1011 X = +0.1011 X=+0.1011 [ X ] 原 = 0.1011 [X]_{\text{原}} = 0.1011 [X]=0.1011
    • X = − 0.1011 X = -0.1011 X=0.1011 [ X ] 原 = 1 − ( − 0.1011 ) = 1.1011 [X]_{\text{原}} = 1 - (-0.1011) = 1.1011 [X]=1(0.1011)=1.1011

2. 纯整数的原码

[ X ] 原 = { X 如果  0 ≤ X < 2 n 2 n + ∣ X ∣ 如果  − 2 n < X ≤ 0 [X]_{\text{原}} = \begin{cases} X & \text{如果 } 0 \le X < 2^n \\ 2^n + |X| & \text{如果 } -2^n < X \le 0 \end{cases} [X]={X2n+X如果 0X<2n如果 2n<X0

  • 示例(8位整数):
    • X = + 13 X = +13 X=+13 [ X ] 原 = 0000   1101 [X]_{\text{原}} = 0000\,1101 [X]=00001101
    • X = − 13 X = -13 X=13 [ X ] 原 = 1000   1101 [X]_{\text{原}} = 1000\,1101 [X]=10001101

二、关键特点

  1. 零的表示不唯一

    • [ + 0 ] 原 = 0000   0000 [+0]_{\text{原}} = 0000\,0000 [+0]=00000000 [ − 0 ] 原 = 1000   0000 [-0]_{\text{原}} = 1000\,0000 [0]=10000000
    • 导致运算需额外处理零问题(如比较时需判断两种情况)。
  2. 数值范围对称

    • n位带符号整数 − ( 2 n − 1 − 1 ) ≤ X ≤ 2 n − 1 − 1 -(2^{n-1}-1) \le X \le 2^{n-1}-1 (2n11)X2n11
    • n位小数 − ( 1 − 2 − ( n − 1 ) ) ≤ X ≤ 1 − 2 − ( n − 1 ) -(1 - 2^{-(n-1)}) \le X \le 1 - 2^{-(n-1)} (12(n1))X12(n1)
  3. 符号位独立性

    • 运算时需拆分符号位和数值位:加减法需单独处理符号,复杂度高。
  4. 硬件实现复杂度

    • 加减法需要多步判断,乘除法规则简单(直接按有符号位运算)。

三、原码转换流程

以下为真值 X X X 转换为原码的流程图及步骤说明:

在这里插入图片描述

转换步骤示例(以X = -13 / 8位整数为例):

  1. 符号位确定:负数 ⇒ 符号位1
  2. 绝对值转为二进制:13 → 00001101
  3. 合成原码:符号位1 + 绝对值位0001101 → 10001101

四、原码的运算与局限性

  1. 加减法问题(必须分开处理)

    • 原码加法:需判断符号位是否相同,不同时转换为减法。
    • 原码减法:转换为加法,可能导致结果符号多次翻转。
  2. 乘法优势

    • 直接取绝对值相乘,符号位单独处理(异或操作)。
    • 示例 − 0.1011 × + 0.1101 -0.1011 \times +0.1101 0.1011×+0.1101):
      • 符号位:1 ⊕ 0 = 1
      • 数值位:0.1011 × 0.1101 → 直接二进制乘法

五、原码与其他机器数的对比分析

特性原码补码反码
零的表示不唯一(±0)唯一(单0)不唯一(±0)
符号位处理独立判断参与运算参与运算
加减法实现复杂(需分支)统一加法实现类似原码但有进位
硬件电路复杂度较高

六、应用场景

  • 特殊运算场景:FPU浮点数尾数运算(需要高精度符号位处理)。
  • 教学与理解基础:学习计算机符号表示的基本模型。
  • 非实时系统:早期简单硬件设备中偶有应用。

总结

原码作为最直观的符号表示方法,其设计直观但运算复杂性高,现代计算机多用补码替代。理解原码是掌握补码、反码的基础,特别需注意零的双重表示带来的潜在问题。

2.1.4补码表示法

为了深入理解补码表示法,我们将从概念、转换方法、运算规则、溢出判断以及实际应用等多个角度进行全面讲解,并结合流程图辅助理解。
在这里插入图片描述

流程图说明

  1. 开始节点标识流程起点
  2. 判断数值符号:首先确定待转换数的正负
  3. 负数处理分支
    • 符号位置1
    • 数值位按位取反
    • 最低位加1
    • 检查溢出时执行模运算(按2^n+1取模)
  4. 正数处理分支
    • 符号位置0
    • 原始数值位不做修改
  5. 最终组合符号位和数值位生成补码
  6. 所有路径汇聚到结束节点输出最终补码

一、补码定义与数学基础

1. 模运算(Modular Arithmetic)

  • 模(Module):计量系统的容量,如时钟的模为12。
  • 同余(Congruence):若 A = B m o d    M A = B \mod M A=BmodM,则 A A A B B B 在模 M M M 下等价。
    • 例: 8 + 10 = 18 = 6 m o d    12 8 + 10 = 18 = 6 \mod 12 8+10=18=6mod12,时钟自动回绕。

2. 补码的思想

  • 将负数表示为模与绝对值的差,使得加法和减法统一:
    X 补 = { X if  X ≥ 0 2 n + X if  X < 0 X_{\text{补}} = \begin{cases} X & \text{if } X \geq 0 \\ 2^n + X & \text{if } X < 0 \end{cases} X={X2n+Xif X0if X<0

二、补码的表示方法

1. 纯小数的补码

  • 范围: − 1 ≤ X < 1 -1 \leq X < 1 1X<1
  • 公式:
    [ X ] 补 = { X 0 ≤ X < 1 2 + X − 1 ≤ X < 0 ( m o d    2 ) [X]_{补} = \begin{cases} X & 0 \leq X < 1 \\ 2 + X & -1 \leq X < 0 \end{cases} \quad (\mod 2) [X]={X2+X0X<11X<0(mod2)
  • 示例 X = − 0.1010 → [ X ] 补 = 10 − 0.1010 = 1.0110 X = -0.1010 \rightarrow [X]_{补} = 10 - 0.1010 = 1.0110 X=0.1010[X]=100.1010=1.0110

2. 纯整数的补码

  • 范围: − 2 n ≤ X < 2 n -2^{n} \leq X < 2^{n} 2nX<2n
  • 公式:
    [ X ] 补 = { X 0 ≤ X < 2 n 2 n + 1 + X − 2 n ≤ X < 0 ( m o d    2 n + 1 ) [X]_{补} = \begin{cases} X & 0 \leq X < 2^n \\ 2^{n+1} + X & -2^n \leq X < 0 \end{cases} \quad (\mod 2^{n+1}) [X]={X2n+1+X0X<2n2nX<0(mod2n+1)
  • 示例 X = − 5 → [ X ] 补 = 100000 − 101 = 1111011 X = -5 \rightarrow [X]_{补} = 100000 - 101 = 1111011 X=5[X]=100000101=1111011(8位补码为 11111011
3. 补码零的唯一性
  • [ + 0 ] 补 = [ − 0 ] 补 = 0 [+0]_{补} = [-0]_{补} = 0 [+0]=[0]=0,消除原码中零的二义性。

三、补码的转换与快速算法

1. 正数的补码

  • 与原码、反码相同。例如, + 5 10 = 00000101 2 +5_{10} = \text{00000101}_2 +510=000001012

2. 负数的补码

  • 常规方法:反码加1
    • 原码 → 反码(符号位不变,其余取反) → 补码(+1)。
  • 快捷方法:(针对纯小数或整数)
    • 从最低位向右找到第一个 1,左侧各位取反,右侧全部保留。
      示例
      原码:1.1110011000 → 补码:1.0001101000 \text{原码:1.1110011000} \rightarrow \text{补码:1.0001101000} 原码:1.1110011000补码:1.0001101000

四、补码的加减运算

1. 运算规则

  • 符号位参与运算,运算结果自动取模。
  • 加法 [ A + B ] 补 = [ A ] 补 + [ B ] 补 m o d    2 n + 1 [A + B]_{补} = [A]_{补} + [B]_{补} \mod 2^{n+1} [A+B]=[A]+[B]mod2n+1
  • 减法 [ A − B ] 补 = [ A ] 补 + [ − B ] 补 m o d    2 n + 1 [A - B]_{补} = [A]_{补} + [-B]_{补} \mod 2^{n+1} [AB]=[A]+[B]mod2n+1

2. 示例:补码减法( 7 − 5 → 7 + ( − 5 ) 7 - 5 \rightarrow 7 + (-5) 757+(5)

  • 7的补码 = 00111 , -5的补码 = 11011 \text{7的补码 = 00111}, \quad \text{-5的补码 = 11011} 7的补码 = 00111,-5的补码 = 11011
    00111 + 11011 = 100010 ( 舍弃溢出位 ) = 00010 ( 十进制  2   ✓ ) \begin{aligned} 00111 &+ 11011 \\ &= 100010 \quad (\text{舍弃溢出位}) \\ &= 00010 \quad (\text{十进制 } 2\ \checkmark) \end{aligned} 00111+11011=100010(舍弃溢出位)=00010(十进制 2 )

五、溢出检测

1. 双符号位法(变形补码)

  • 溢出条件:若结果符号位为 01(正溢出)或 10(负溢出)。
  • 逻辑电路:溢出信号由两位符号位的异或产生。

2. 进位判断法

  • 溢出公式
    O V R = C s ⊕ C s − 1 OVR = C_s \oplus C_{s-1} OVR=CsCs1
    (符号位进位 C s C_s Cs 与次高位进位 C s − 1 C_{s-1} Cs1 的异或)

六、补码与移码的关系

1. 移码定义

  • 用于浮点数阶码,对补码符号位取反:
    [ X ] 移 = [ X ] 补 ± 2 n [X]_{移} = [X]_{补} \pm 2^n [X]=[X]±2n,或直接偏置为无符号数。

2. 比较补码与移码

取反符号位
+2^n
用于比较阶码
补码
移码
真值
浮点运算

七、练习题巩固

  1. 转换补码
    • 将十进制 − 28.75 -28.75 28.75 转换为 IEEE 754 单精度浮点数(补码格式)。
  2. 计算溢出
    • 若使用 8 位补码计算 100 + 50 100 + 50 100+50,是否溢出?
  3. 补码求和
    • [ X ] 补 = 1.1011 , [ Y ] 补 = 0.1101 [X]_{补} = 1.1011, [Y]_{补} = 0.1101 [X]=1.1011,[Y]=0.1101,求 [ X + Y ] 补 [X + Y]_{补} [X+Y]

答案提示

  1. 补码转换
    • 单精度浮点数符号位 1(负数),阶码偏移后计算为 131 131 13110000011),尾数为 1.1110011000... 1.1110011000... 1.1110011000...
  2. 溢出判断
    100 + 50 = 15 0 10 100 + 50 = 150_{10} 100+50=15010,8位补码范围 [ − 128 , 127 ] [-128, 127] [128,127],因此溢出。
  3. 补码加法
    1.1011 + 0.1101 = 10.1000 1.1011 + 0.1101 = 10.1000 1.1011+0.1101=10.1000,丢弃高位后为 0.1000(符号位溢出需处理)。

通过结合理论与实际运算示例,补码的核心思想得以体现:统一加减法操作,简化电路设计,同时在数字表示和运算效率之间找到平衡。

2.1.5反码表示法

反码是一种带符号数的表示方法,与补码的转换密切相关。以下是其核心定义、特性、转换步骤及流程图。

一、反码的定义

1. 纯整数的反码

对于长度为 n + 1 n+1 n+1 位(1位符号位 n n n 位数值位)的整数,其反码定义为:
[ X ] 反 = { X 若  0 ≤ X < 2 n ( 2 n + 1 − 1 ) + X 若  − 2 n < X ≤ 0 [X]_反 = \begin{cases} X & \text{若 } 0 \leq X < 2^n \\ (2^{n+1} - 1) + X & \text{若 } -2^n < X \leq 0 \end{cases} [X]={X(2n+11)+X 0X<2n 2n<X0

示例(5位整数):

  • X = − 5 10 X = -5_{10} X=510, n = 4 n=4 n=4
    [ X ] 反 = 2 5 − 1 + ( − 5 ) = 1111 1 2 − 010 1 2 = 1101 0 2 [X]_反 = 2^{5} - 1 + (-5) = 11111_2 - 0101_2 = 11010_2 [X]=251+(5)=11111201012=110102

2. 纯小数的反码

对于小数 X = X s . X 1 X 2 . . . X n X = X_s.X_1X_2...X_n X=Xs.X1X2...Xn(符号位 X s X_s Xs),反码定义为:
[ X ] 反 = { X 若  0 ≤ X < 1 2 − 2 − n + X 若  − 1 < X ≤ 0 [X]_反 = \begin{cases} X & \text{若 } 0 \leq X < 1 \\ 2 - 2^{-n} + X & \text{若 } -1 < X \leq 0 \end{cases} [X]={X22n+X 0X<1 1<X0

示例(4位小数):

  • X = − 0.101 1 2 X = -0.1011_2 X=0.10112
    [ X ] 反 = 1.111 1 2 − 0.101 1 2 = 1.010 0 2 [X]_反 = 1.1111_2 - 0.1011_2 = 1.0100_2 [X]=1.111120.10112=1.01002

二、反码的转换流程

流程图(Mermaid表示):

在这里插入图片描述

步骤说明

  1. 判断符号:若数值为正数,符号位为0;若为负数,符号位为1。
  2. 处理数值位
    • 正数:保留数值位二进制原样。
    • 负数:符号位保持1,数值位逐位取反(0→1,1→0)。
  3. 合成反码:合并符号位与处理后的数值位。

示例转换(-13的8位反码):

  1. 正数原码0000 1101
  2. 负数原码1000 1101
  3. 反码转换:符号位1,数值位取反 → 1111 001011110010

三、反码的核心特性

特性描述
符号位处理符号位单独处理,不参与数值运算
零的表示存在两种零:+0 → 00000000, -0 → 11111111
表示范围与原码对称,例如8位整数范围为 -127 ~ 127,无法表示 -128 (补码可多表示一个数)
加减法规则需处理循环进位:若最高位有进位,则加到最低位。例如 1 + (-1):
0001 + 1110 = 1111 → 0000(实际应为0,需循环进位)
应用场景现代计算机中较少使用,通常作为补码转换的中间步骤

四、与原码、补码的对比

特征原码反码补码
符号位处理符号位独立判断符号位独立判断符号参与运算
零的表示±0 双零±0 双零0唯一表示
表示范围(8位)-127 ~ +127-127 ~ +127-128 ~ +127
运算复杂度加减法需符号处理加减法需循环进位加减法统一加法实现
硬件实现复杂较复杂简单

五、典型例题

例题1:将 -7 转换为8位反码

  • 原码:10000111
  • 反码:符号位1,数值位取反 → 11111000

例题2:计算 3 + (-3)(4位反码)

  • 3 → 0011-3反码 → 1100
  • 相加:0011 + 1100 = 1111(即 -0

总结

反码虽因双零问题和运算复杂性被补码取代,但其在理解数值编码发展过程中意义重大。其核心思想是 符号位固定,数值位取反,适合作为补码运算的中间步骤。

2.1.6 3种机器数的比较与转换

一、核心特性对比

特征原码补码反码
符号位处理符号位独立,单独判断符号位视为数值位,参与运算符号位单独处理
零的表示±0 各一个(如 00001000唯一零(0000±0 各一个(如 00001111
数值范围(8位)-127 ~ +127-128 ~ +127-127 ~ +127
加减法实现需判断符号位,运算复杂统一为加法实现,无符号判断需循环进位(进位加到最低位)
应用场景早期硬件/数学直观理解现代计算机通用设计(效率高)过渡方案,偶用于特定运算

二、转换规则与流程

1. 真值 → 机器数
  • 原码:符号位 X = − 5 10 ⇒ [ X ] 原 = 1000010 1 2 X = -5_{10} \Rightarrow [X]_原 = 10000101_2 X=510[X]=100001012
    X = + 0.37 5 10 ⇒ [ X ] 原 = 0.01 1 2 X = +0.375_{10} \Rightarrow [X]_原 = 0.011_2 X=+0.37510[X]=0.0112

  • 补码

    • 正数:与原码相同。
    • 负数:原码符号位不变,数值位取反加1(快捷法:从最低位开始保留第一个1及后的0,其余取反)。
      示例:
      X = − 5 10 ⇒ [ X ] 补 = 1111101 1 2 X = -5_{10} \Rightarrow [X]_补 = 11111011_2 X=510[X]=111110112
      X = − 0.10 1 2 ⇒ [ X ] 补 = 1.01 1 2 X = -0.101_2 \Rightarrow [X]_补 = 1.011_2 X=0.1012[X]=1.0112
  • 反码

    • 正数:与原码相同。
    • 负数:符号位不变,数值位逐位取反。
      示例:
      X = − 5 10 ⇒ [ X ] 反 = 1111101 0 2 X = -5_{10} \Rightarrow [X]_反 = 11111010_2 X=510[X]=111110102

2. 机器数之间的转换

在这里插入图片描述

转换要点

  • 补码与反码的互转:补码减1即为反码。
  • 原码转补码:符号位不变,数值取反加1。
  • 直接由真值转补码(无需原码):负数直接应用快捷法(从最低位保留第一个1,左侧取反)。

三、典型例题

例1:将 X = − 7 10 X = -7_{10} X=710 转换为8位原码、反码、补码。

  • 原码:10000111
  • 反码:11111000(数值取反)
  • 补码:11111001(反码+1)

例2:计算补码加法 7 + ( − 5 ) 10 7 + (-5)_{10} 7+(5)10(8位)。

  • 7 补 = 00000111 7_{补} = 00000111 7=00000111
  • − 5 补 = 11111011 -5_{补} = 11111011 5=11111011
  • 加法结果:
      
      00000111
      
      - 11111011
      
      ---
      
      100000010 → 舍去溢出高位 → 00000010(十进制2✓)  
      

四、关键流程图示

在这里插入图片描述

五、数值范围与溢出

  • 补码优势:唯一可表示最小数(对称性打破),如8位整数补码可表-128。
  • 溢出检测:符号位+次高位进位是否冲突(01正溢出,10负溢出)。

通过理解三种机器数的转换规则及对比,能更深入掌握计算机处理带符号数的底层逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiao--xin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值