计组学习笔记之数据的表示和运算

1 进位计数制

1.1 r 进制计数法
  • r 进制

    KnKn1...K2K1K0K1K2...Km=Knrn+Kn1rn1+...+K2r2+K1r1+K0r0+K1r1+...+Kmrm

  • 基数:每个数码位用到的不同符号的个数,r 进制的基数为 r

1.2 r 进制转十进制
  • 即:上述公式 (1)
1.3 二、八、十六进制转换
  • 二进制转八进制:三位为一组,不够的补零(整数部分补在头部,小数部分补在尾部),然后各组转换为对应的八进制

    二进制转八进制

  • 八进制转二进制:每位八进制,转成对应的 3 位二进制数

    八进制转二进制

  • 二进制转十六进制:四位为一组,不够的补零(整数部分补在头部,小数部分补在尾部),然后各组转为对应的十六进制

    二进制转十六进制

  • 十六进制转二进制:每位十六进制,转成对应的 4 位二进制数

    十六进制转二进制

1.4 各进制常见书写方式
  • 二进制:(10101)210101B
  • 八进制:(1652)8
  • 十进制:(1652)101652D
  • 十六进制:(1652)161652H0x1652
1.5 十进制转 r 进制
  • 整数部分:除基取余,由高到低

    整数部分

  • 小数部分:乘基取证,由高到低

    小数部分

1.6 真值和机器数
  • 真值:符合人类使用习惯的数字

  • 机器数:数字实际存储到机器中的形式,正负号需要被数字化

    真值和机器数

2 BCD 码

2.1 8421 码
  • 定义:一个二进制位可以表示两种状态,那么四位二进制码则可以表示 16 种状态,取其中的 10 种来一一映射到 0 ~ 9,则此时,四个比特位对应的权值由高位到低位分别是 8、4、2、1,则 8421 码由此得来
  • 分类:每个比特位对应的权值都是固定的,因此属于有权码
  • 8421 码一一映射关系
0 1 2 3 4 5 6 7 8 9
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
  • 8421 码计算加法

    • 将两个十进制数转为二进制后相加,若结果不在上述映射表中,则将结果加上 (0110)2 进行修正

    8421码加法例子

2.2 余 3 码
  • 定义:余 3 码是在 8421 码的基础上,再加上 (0011)2 得来的
  • 分类:每个比特位的权值不固定,因此属于无权码
  • 余 3 码一一映射关系
0 1 2 3 4 5 6 7 8 9
0011 0100 0101 0110 0111 1000 1001 1010 1011 1100
2.3 2421 码
  • 定义:与 8421 码类似,只是改变了权值定义,从高位到低位的权值分别是 2、4、2、1

  • 2421 码一一映射关系

0 1 2 3 4 5 6 7 8 9
0000 0001 0010 0011 0100 1011 1100 1101 1110 1111
  • 2124 码规定:0 ~ 4 第一位位一定是 0;5 ~ 9 第一位一定是 1

3 字符与字符串

3.1 英文编码
  • 常用英文字符(包括标点符号)共 128 个,即 27=128 ,可使用 7 个比特位进行表示,但由于计算机内部存储都是 2n 关系,因此使用 8 个比特位,即一个字节来表示英文的字符与标点(即 ASCII 码)

  • ASCII 码表有如下特点:

    • 32 ~ 126 均为可印刷字符,其余为控制、通信字符
    • 数字(48 ~ 57):48(0011 0000)    57(0011 1001) ,前四位均相同,后四位就是 0 ~ 9 分别对应的二进制码
    • 大写字母(65 ~ 90):65(0100 0001)    90(0101 1010) ,前三位均相同,后五位就是 1 ~ 26 对应的二进制码
    • 小写字母(97 ~ 122):97(0110 0001)    122(0111 1010) ,前三位均相同,后五位就是 1 ~ 26 对应的二进制码

ASCII 码表

3.2 中文编码

以 GB 2312-80 为例,汉字 + 各种符号共有 7445 个

GB2312

  • 区位码:使用 94 个区,每个区 94 个位置(即一个行列数均为 94 的矩阵)来表示(例如:汉字“啊”表示为: 16 01)

  • 国标码:如果传输中某汉字对应的区位码刚好在 ASCII 码表的 0 ~ 31 位中,那么就会被计算机误认为是控制字符、通信字符。为了避免这一问题,则区位码分别加 32 (20H),此时就是国标码

  • 汉字内码:国标码可能还会与 32 ~ 127 的字符冲突,因此区位码再分别加 64 (80H),此时就是汉字内码

  • 汉字字形码:计算机存储的汉字输出时,会转换为汉字字形码进行输出

    汉字字形码

3.3 字符串

字符串存储

4 奇偶校验码

  • 奇偶校验码结构

    奇偶校验码

  • 奇校验码:整个校验码(有效信息位 + 校验位)中“1”个数为奇数

  • 偶校验码:整个校验码(有效信息位 + 校验位)中“1”个数为偶数

  • 缺点:当传输过程中,发生跳变的位数为奇数时,可以检测到信息出错;但是当为偶数时,则无法检验是信息否出错

  • 偶校验的机器实现:各信息进行异或(模2加)运算,得到的结果即为偶校验位

奇偶校验例题

5 海明校验码

5.1 设计思想

对编码分组进行偶校验,多个校验位可以反映出错的位置

5.2 求解步骤
  • 确定校验位的个数
    • k 个校验位,n 个信息位
    • 满足 2kn+k+1
  • 确定校验位分布
    • 校验位 Pi 位于第 2i1 位,即第 124816...
    • 空出来的其余位置依次填入信息位 Di
  • 求校验位的值
    • 将信息位的位置序号用 k 位二进制数表示出来
    • 校验位 Pi 与位置序号第 i 位为 1 的信息位归类为一组,并进行偶校验
  • 纠错
    • P1P2P3...Pn 所属各组进行异或(相当于再次分组偶校验),求得 S1S2S3...Sn
    • S1 S2 S3 ... Sn= 000...0 ,则说明无错
    • S1 S2 S3 ... Sn 000...0 ,则其值反应出错位置
5.3 特点
  • 海明码与 1 位纠错,2 位检错能力
  • 为了区分 1 位还是 2 位出错,需要添加一个“全校验位”,并对整体进行偶校验

【例】海明码求解例题

海明码步骤01

海明码步骤02

海明码补充

6 循环冗余校验码

6.1 设计思想

数据发送方、接收方共同约定一个“除数”,K 个信息位 + R 个校验位作为“被除数”,添加校验位后需保证“模二除”的余数为 0

6.2 求解步骤
  • 构造
    • 由生成多项式确定“除数”
    • 若生多项式中 x 的最高次方数为 R,则“除数”有 R + 1 位
    • K 个信息位 + R 个 0,作为“被除数”
    • “被除数”、“除数”进行模二除运算,得到 R 位余数
    • K 个信息位 + R 位余数 = CRC 码(循环冗余校验码)
  • 校验
    • 收到 K + R 位数据,与生成多项式进行模二除,计算 R 位余数
    • 余数为 0,说明无错
    • 余数非 0,说明出错
  • 检错、纠错能力
    • 可以检测数所有奇数个错误
    • 可以检测出所有双比特位的错误
    • 可以检测出所有小于等于校验位长度的连续错误
    • 若选择合适的生成多项式,且满足 2RK+R+1 ,则可以纠正单比特位错误
    • 对于确定的生成多项式,出错位于余数是相对应的

【例】循环冗余校验码例题

CRC码01

CRC码02

CRC码03

7 定点数的表示

7.1 无符号数
  • 定义:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值
  • 范围:[0, 2n1]
  • 通常只有无符号整数,而没有无符号小数
7.2 有符号数
  • 多一个符号位,0 正 1 负

有符号数结构

7.3 原码
  • 定义:用尾数表示真值的绝对值,符号位“0 / 1”对应“正 / 负”
  • 若机器字长为 n + 1 位,则符号位永远占 1 位,尾数占 n 位
  • 若机器字长为 n + 1 位,则原码整数的范围:[(2n1), 2n1]
  • 若机器字长为 n + 1 位,则原码小数的范围:[(12n), 12n]
  • 对于真值 0,有 +00 两种形式

原码

7.4 反码
  • 若符号位为 0,则反码与原码相同

  • 若符号位为 1,则数值位全部取反

  • 反码与原码表示的范围相同

  • 对于真值 0,有 +00 两种形式

反码

7.5 补码
  • 若符号位为 0,则补码与原码相同
  • 若符号位为 1,则在反码末尾 + 1(要考虑进位)
  • 若机器字长为 n + 1 位,则补码整数的范围:[2n, 2n1]
  • 若机器字长为 n + 1 位,则补码小数的范围:[1, 12n]
  • 对于真值 0,只有一种表示形式
  • 补码转原码与原码转补码方式一致:尾数取反,末位 + 1
  • 作用:使用补码可以将减法操作转变为加法操作,ALU 无需再设计减法器,降低硬件成本。进行加减法操作时,符号位一起参与运算

补码

7.6 移码
  • 在补码的基础上,将符号位取反就是移码
  • 移码只能用于表示定点整数
  • 若机器字长为 n + 1 位,则补码整数的范围:[2n, 2n1]
  • 对于真值 0,只有一种表示形式
  • 作用:用来方便的比较大小,从最高位开始比较,先出现 1 的数较大

移码

【补充】根据 [x] 快速求 [x] 的方式:符号位、数值位全部取反,然后末位 + 1

8 移位运算

8.1 算术移位
  • 定义:通过改变各个数码位和小数点的相对位置,从而改变各个数码位的位权,从而实现乘法、除法运算

  • 原码的算术移位:符号位保持不变,仅对数值位进行移位

    • 原码算术右移

      • 高位补 0,低位舍弃
      • 若舍弃的位是 0,相当于 ÷ 2
      • 若舍弃的位非 0,则会丢失精度

      原码算术右移

    • 原码算术左移

      • 低位补 0,高位舍弃
      • 若舍弃的位是 0,相当于 ×2
      • 若舍弃的位非 0,则会出现严重误差

      原码算术左移

  • 反码的算术移位

    • 正数的反码移位与原码移位完全相同
      • 右移:高位补 0,低位舍弃
      • 左移:低位补 0,高位舍弃
    • 负数的反码移位规则如下
      • 右移:高位补 1,低位舍弃
      • 左移:低位补 1,高位舍弃
  • 补码的算术移位

    • 正数的补码移位与原码移位完全相同

      • 右移:高位补 0,低位舍弃
      • 左移:低位补 0,高位舍弃
    • 负数的补码移位规则如下

      • 右移(同反码):高位补 1,低位舍弃
      • 左移(同原码):低位补 0,高位舍弃

      补码负数移位

算术移位总结

8.2 逻辑移位
  • 逻辑右移:高位补 0,低位舍弃
  • 逻辑左移:低位补 0,高位舍弃
  • 逻辑左移相当于对“无符号数”的算术移位

逻辑移位

8.3 循环移位
  • 循环左移:舍弃的高位去填补空出来的低位

    循环左移01

    循环左移02

    循环左移03

  • 循环右移:舍弃的低位去填补空出来的高位

  • 带进位位的循环移位

    带进位位01

    带进位位02

    带进位位03

  • 应用:实现大端存储和小端存储之间的转换(循环左/右移总字节位)

循环移位

9 加减运算

9.1 原码的加减运算
  • 原码的加法运算(计算机中通常不使用原码进行加减运算)
    • 正 + 正:绝对值做加法,结果为正,可能溢出
    • 负 + 负:绝对值做加法,结果为负,可能溢出
    • 正 + 负:绝对值大的减绝对值小的,符号同绝对值大的数
    • 负 + 正:绝对值大的减绝对值小的,符号同绝对值大的数
  • 原码的减法运算:将“减数”的符号取反,转变为加法后再运算
9.2 补码的加减运算

补码加减运算

9.3 溢出的判断

溢出例子

该例子中,可以看到计算结果并不对,因为计算结果超出了机器字长所能表示的范围,所以发生了溢出,那么机器怎么可以判断是否溢出呢?

  • 溢出的分类

    • 上溢:只有“正 + 正”才会上溢,即“正 + 正 = 负”
    • 下溢:只有“负 + 负”才会下溢,即“负 + 负 = 正”

    溢出分类

  • 溢出的判断(设计算 “A + B”发生溢出)

    • 一位符号位判断溢出
      • 定义:设 A 的符号位为 AS ,B 的符号位为 BS ,运算结果的符号为 SS ,则溢出判断的逻辑表达式为:V=ASBSS¯S+A¯SB¯SSS (其中:ASBS 表示与运算;A¯S 表示非运算;A+B 代表或运算)
      • V=0 ,则表示无溢出
      • V=1 ,则表示有溢出
    • 一位符号位,根据数据位进位情况判断溢出
      • 定义:设符号位的进位为 CS ,最高数值位的进位为 C1 ,则判断溢出的逻辑表达式为:V=CSC1 (其中: 表示异或运算)
      • V=0 ,则表示无溢出
      • V=1 ,则表示有溢出
    • 双符号位
      • 定义:正数符号位为 00,负数符号位为 11,记两个符号位分别为 CS1CS2 ,则判断溢出的逻辑表达式为:V=CS1CS2 (其中: 表示异或运算)
      • V=0 ,则表示无溢出
      • V=1 ,则表示有溢出
9.4 符号扩展

符号扩展

10 乘法运算

10.1 原码一位乘
  • 设机器字长为 n + 1 位,数值部分占 n 位
  • 符号位“乘数”和“被乘数”的符号位异或来决定
  • 数值位
    • 被乘数和乘数通过 n 轮加法、移位完成,根据当前乘数中参与运算的位确定 ACC 应该加什么
    • 若当前运算位值为 1,则 (ACC)+[|X|]
    • 若当前运算位值为 0,则 (ACC)+0
    • 每轮加法结束后,ACCMQ 中的内容统一逻辑右移一位

原码一位乘模拟

10.2 补码一位乘
  • 设机器字长为 n + 2 位,数值位占 n 位
  • 符号位参与运算
  • 数值位
    • 辅助位 - MQ 中最低位 = 1 时,(ACC)+[X]
    • 辅助位 - MQ 中最低位 = 0 时,(ACC)+0
    • 辅助位 - MQ 中最低位 = -1 时,(ACC)+[X]

补码一位乘模拟

10.3 原码乘 VS 补码乘
  • 符号位
    • 原码:不参与运算,通过异或确定
    • 补码:与数值位一起参与运算
  • 数值位
    • 原码:由被乘数、乘数的绝对值进行 n 轮加法、n 轮移位得到
    • 补码:由被乘数、乘数进行 n 轮解法、n 轮移位,最后再多一次加法得到
  • 加法
    • 原码:可能 +0+[|X|]
    • 补码:可能 +[X]0+[X]
  • 移位
    • 原码:每次都是“逻辑右移”
    • 补码:每次都是“补码的算术右移”

11 除法运算

11.1 原码除法
  • 恢复余数法(默认被除数为 x ,除数为 y

    • 设机器字长为 n + 1 位,符号位占 1 位,数值位占 n 位
    • 符号位单独处理 =xsys
    • 数值位取绝对值进行除法计算
    • 若余数为负,则商 0,并 +|| ,实现恢复余数,再将余数逻辑左移,进行下一步
    • 若余数为正,则商 1,然后余数逻辑左移

    恢复余数法

  • 加减交替法(不恢复余数法)(默认被除数为 x ,除数为 y

    • 设机器字长为 n + 1 位,符号位占 1 位,数值位占 n 位
    • 符号位单独处理 =xsys
    • 数值位取绝对值进行除法计算
    • 若余数为负,则商 0,并将余数逻辑左移,然后再 +||
    • 若余数为正,则商 1,并将余数逻辑左移,然后再 ||

    加减交替法

11.2 补码除法
  • 符号位参与运算
  • 被除数、除数、余数均为双符号位
  • 被除数和除数同号,则被除数减去除数;否则被除数加上除数
  • 若余数和除数同号,则商 1,余数逻辑左移移一位,然后减去除数
  • 若余数和除数异号,则商 0,余数逻辑左移移一位,然后加上除数
  • 以上步骤共重复 n 次
  • 重复 n 次后,末位的商恒置为 1 (精度误差不会超过 2n

补码除法

11.3 除法运算的比较

除法运算的比较

12 数据的大小和排列

12.1 大小端模式
  • 多字节数据在内存中一定是占据着连续的几个字节

  • 最高有效字节(MSB),最低有效字节(LSB)(例如:某 int 字节为 01 23 45 67 H,则01 为最高有效字节,67 为最低有效字节)

    大小端模式

12.2 边界对齐
  • 现代计算机通常是按照字节编址,即每个字节对应一个地址

  • 通常也支持按字、按半字、按字节寻址

  • 假设存储字长为 32 位,则 1字 = 32 bit,半字 = 16 bit,每次访存只能读/写 1 个字

  • 边界对齐(空间换时间)

    边界对齐

  • 边界不对齐(时间换空间)

    边界不对齐

13 浮点数的表示

13.1 表示
  • 阶码:指明小数点后移、前移位数,通常是由补码、移码表示的定点整数

  • 尾数:给出具体数值,通常是用补码、原码表示的定点小数

  • 真值:N=rEM

    浮点数表示

13.2 规格化
  • 尾数的最高数值位必须是一个有效值(类比十进制科学计数法,通常我们会让数值部分最高位为非0)
  • 左规:数值位最高位无效时,通过尾数算数左移、阶码减 1 的方法处理,直到尾数最高数值位有效时停止
  • 右规:若采用双符号位表示尾数,则当运算后尾数“假溢出”"时,可以通过尾数右移、阶码加 1 的方法处理
  • 原码表示的尾数规格化:尾数的最高数值位必须是 1
  • 补码表示的尾数规格化:尾数最高数值位必须和尾数符号位相反
13.3 表示范围

表示范围

14 浮点数标准 IEEE 754

14.1 浮点数结构
  • 阶码部分用移码表示
  • 尾数用原码表示,且隐藏表示最高位的 1,即 1.M
  • 偏置值总是 2n11
  • 由浮点数确定真值
    • 根据“某浮点数”,确定数符、阶码、尾数的分布
    • 确定尾数 1.M (最高位隐含 1)
    • 确定阶码的真值 = 移码 - 偏置值(可将移码看做无符号数,用无符号数的值减去偏置值)
    • (1)S1.M2E

浮点数结构

14.2 各类型的结构

各类型结构

14.3 浮点数的转换

【例 1】将十进制数 -0.75 转换为 IEEE 754 的单精度浮点数格式表示

例题一

【例 2】IEEE 754 的单精度浮点数 C0 A0 00 00 H 的真值是多少

例题二

14.4 表示范围
  • 最小绝对值:尾数全为 0,阶码真值最小 -126,对应的移码机器数 0000 0001,此时整体的真值为 (1.0)22126
  • 最大绝对值:尾数全为 1,阶码真值最大 127,对应移码机器数 1111 1110,此时整体的真值为 (1.11...11)22127
  • 表示类型
    • 常规浮点数: 1E254 时,真值 =(1)S1.M2E127
    • 非规格化小数:阶码 E 全为 0,尾数 M 不全为 0,即 ±(1.xxx)22126
    • 真值 ±0 :阶码 E、尾数 M 全为 0
    • 无穷大、无穷小:阶码 E 全为 1,尾数 M 全为 0
    • 非数值(NaN):阶码 E 全为 1,尾数 M 不全为 0

15 浮点数的运算

15.1 浮点数加减运算
  • 格式转换:将所给的十进制数根据题目规定的阶符、阶码、数符、尾数位数,转换为对应的二进制形式
  • 对阶:统一两者的阶数,较小的向较大的靠齐(如果是较大的向较小的靠齐,因为计算机内部表示浮点数的尾数是定点小数,这样操作会让尾数有好几个有效位,这与规格化向违背)
  • 尾数加减:通常是用双符号位表示尾数,这样可以有效拯救溢出,尾数相加减,阶码不改变
  • 规格化:若是尾数出现多个有效位,则要进行“右规”,否则要实行“左规”
  • 舍入:若结果超过了规定的有效尾数位数,则要进行舍入
    • “0”舍“1”入法:在进行右规时,若别已取得最高位数值为 0,则直接舍去;若为 1,则在剩余尾数的末尾 +1,这可能会导致再次溢出,此时又要再次进行右规
    • 恒置“1”法:尾数右移时,无论丢弃的尾数的最高位是何值,都将右移后的尾数末尾置为“1”,这样可能会使尾数变大或者变小
  • 判断溢出:若规定阶码不能超过两位,则计算后阶码超过范围,则会发生溢出(真正的溢出,尾数溢出有时可以通过规格化来拯救)

【例 1】不考虑舍入

例:已知十进制数X = -5/256、Y = +59/1024,按机器补码浮点运算规则计算 X - Y, 结果
用二进制表示,浮点数格式如下:阶符取 2 位,阶码取 3 位,数符取 2 位,尾数取 9 位

不考虑舍入

【例 2】考虑舍入

考虑舍入

16 ALU 基本原理

16.1 电路基础知识
  • 逻辑运算:与、或、非

    与或非

  • 与非、或非、异或、同或

    与非、同或

  • 逻辑表达式就是电路的数学化表示,根据逻辑运算的规则对逻辑表达式进行优化,就是在优化电路

16.2 加法器的实现
  • 一位全加器

    • 两个本位都为 1
    • 两个本位中,有一个是 1,且是来自低位的进位

    一位全加器

  • 串行加法器

    • 只有一个全加器,数据逐位串行送入加法器中进行运算
    • 进位触发器用来寄存进位信号,以便参与下一次运算
    • 如果操作数长 n 位,加法就要分 n 次进行,每次产生一位和,并且串行逐位地送回寄存器

    串行加法器

  • 并行加法器

    • 把 n 个全加器串接起来,就可进行两个 n 位数的相加

    并行加法器

17 本章总结

posted @   悟道九霄  阅读(730)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示