计组学习笔记之数据的表示和运算
1 进位计数制
1.1 r 进制计数法
-
r 进制
-
基数:每个数码位用到的不同符号的个数,r 进制的基数为 r
1.2 r 进制转十进制
- 即:上述公式 (1)
1.3 二、八、十六进制转换
-
二进制转八进制:三位为一组,不够的补零(整数部分补在头部,小数部分补在尾部),然后各组转换为对应的八进制
-
八进制转二进制:每位八进制,转成对应的 3 位二进制数
-
二进制转十六进制:四位为一组,不够的补零(整数部分补在头部,小数部分补在尾部),然后各组转为对应的十六进制
-
十六进制转二进制:每位十六进制,转成对应的 4 位二进制数
1.4 各进制常见书写方式
- 二进制: 、
- 八进制:
- 十进制: 、
- 十六进制: 、 、
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 码计算加法
- 将两个十进制数转为二进制后相加,若结果不在上述映射表中,则将结果加上 进行修正
2.2 余 3 码
- 定义:余 3 码是在 8421 码的基础上,再加上 得来的
- 分类:每个比特位的权值不固定,因此属于无权码
- 余 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 个,即 ,可使用 7 个比特位进行表示,但由于计算机内部存储都是 关系,因此使用 8 个比特位,即一个字节来表示英文的字符与标点(即 ASCII 码)
-
ASCII 码表有如下特点:
- 32 ~ 126 均为可印刷字符,其余为控制、通信字符
- 数字(48 ~ 57): ,前四位均相同,后四位就是 0 ~ 9 分别对应的二进制码
- 大写字母(65 ~ 90): ,前三位均相同,后五位就是 1 ~ 26 对应的二进制码
- 小写字母(97 ~ 122): ,前三位均相同,后五位就是 1 ~ 26 对应的二进制码
3.2 中文编码
以 GB 2312-80 为例,汉字 + 各种符号共有 7445 个
-
区位码:使用 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 个信息位
- 满足
- 确定校验位分布
- 校验位 位于第 位,即第 位
- 空出来的其余位置依次填入信息位
- 求校验位的值
- 将信息位的位置序号用 k 位二进制数表示出来
- 校验位 与位置序号第 位为 1 的信息位归类为一组,并进行偶校验
- 纠错
- 对 所属各组进行异或(相当于再次分组偶校验),求得
- 若 ,则说明无错
- 若 ,则其值反应出错位置
5.3 特点
- 海明码与 1 位纠错,2 位检错能力
- 为了区分 1 位还是 2 位出错,需要添加一个“全校验位”,并对整体进行偶校验
【例】海明码求解例题
6 循环冗余校验码
6.1 设计思想
数据发送方、接收方共同约定一个“除数”,K 个信息位 + R 个校验位作为“被除数”,添加校验位后需保证“模二除”的余数为 0
6.2 求解步骤
- 构造
- 由生成多项式确定“除数”
- 若生多项式中 x 的最高次方数为 R,则“除数”有 R + 1 位
- K 个信息位 + R 个 0,作为“被除数”
- “被除数”、“除数”进行模二除运算,得到 R 位余数
- K 个信息位 + R 位余数 = CRC 码(循环冗余校验码)
- 校验
- 收到 K + R 位数据,与生成多项式进行模二除,计算 R 位余数
- 余数为 0,说明无错
- 余数非 0,说明出错
- 检错、纠错能力
- 可以检测数所有奇数个错误
- 可以检测出所有双比特位的错误
- 可以检测出所有小于等于校验位长度的连续错误
- 若选择合适的生成多项式,且满足 ,则可以纠正单比特位错误
- 对于确定的生成多项式,出错位于余数是相对应的
【例】循环冗余校验码例题
7 定点数的表示
7.1 无符号数
- 定义:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值
- 范围:
- 通常只有无符号整数,而没有无符号小数
7.2 有符号数
- 多一个符号位,0 正 1 负
7.3 原码
- 定义:用尾数表示真值的绝对值,符号位“0 / 1”对应“正 / 负”
- 若机器字长为 n + 1 位,则符号位永远占 1 位,尾数占 n 位
- 若机器字长为 n + 1 位,则原码整数的范围:
- 若机器字长为 n + 1 位,则原码小数的范围:
- 对于真值 0,有 两种形式
7.4 反码
-
若符号位为 0,则反码与原码相同
-
若符号位为 1,则数值位全部取反
-
反码与原码表示的范围相同
-
对于真值 0,有 两种形式
7.5 补码
- 若符号位为 0,则补码与原码相同
- 若符号位为 1,则在反码末尾 + 1(要考虑进位)
- 若机器字长为 n + 1 位,则补码整数的范围:
- 若机器字长为 n + 1 位,则补码小数的范围:
- 对于真值 0,只有一种表示形式
- 补码转原码与原码转补码方式一致:尾数取反,末位 + 1
- 作用:使用补码可以将减法操作转变为加法操作,ALU 无需再设计减法器,降低硬件成本。进行加减法操作时,符号位一起参与运算
7.6 移码
- 在补码的基础上,将符号位取反就是移码
- 移码只能用于表示定点整数
- 若机器字长为 n + 1 位,则补码整数的范围:
- 对于真值 0,只有一种表示形式
- 作用:用来方便的比较大小,从最高位开始比较,先出现 1 的数较大
【补充】根据 快速求 的方式:符号位、数值位全部取反,然后末位 + 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 循环移位
-
循环左移:舍弃的高位去填补空出来的低位
-
循环右移:舍弃的低位去填补空出来的高位
-
带进位位的循环移位
-
应用:实现大端存储和小端存储之间的转换(循环左/右移总字节位)
9 加减运算
9.1 原码的加减运算
- 原码的加法运算(计算机中通常不使用原码进行加减运算)
- 正 + 正:绝对值做加法,结果为正,可能溢出
- 负 + 负:绝对值做加法,结果为负,可能溢出
- 正 + 负:绝对值大的减绝对值小的,符号同绝对值大的数
- 负 + 正:绝对值大的减绝对值小的,符号同绝对值大的数
- 原码的减法运算:将“减数”的符号取反,转变为加法后再运算
9.2 补码的加减运算
9.3 溢出的判断
该例子中,可以看到计算结果并不对,因为计算结果超出了机器字长所能表示的范围,所以发生了溢出,那么机器怎么可以判断是否溢出呢?
-
溢出的分类
- 上溢:只有“正 + 正”才会上溢,即“正 + 正 = 负”
- 下溢:只有“负 + 负”才会下溢,即“负 + 负 = 正”
-
溢出的判断(设计算 “A + B”发生溢出)
- 一位符号位判断溢出
- 定义:设 A 的符号位为 ,B 的符号位为 ,运算结果的符号为 ,则溢出判断的逻辑表达式为: (其中: 表示与运算; 表示非运算; 代表或运算)
- 若 ,则表示无溢出
- 若 ,则表示有溢出
- 一位符号位,根据数据位进位情况判断溢出
- 定义:设符号位的进位为 ,最高数值位的进位为 ,则判断溢出的逻辑表达式为: (其中: 表示异或运算)
- 若 ,则表示无溢出
- 若 ,则表示有溢出
- 双符号位
- 定义:正数符号位为 00,负数符号位为 11,记两个符号位分别为 ,则判断溢出的逻辑表达式为: (其中: 表示异或运算)
- 若 ,则表示无溢出
- 若 ,则表示有溢出
- 一位符号位判断溢出
9.4 符号扩展
10 乘法运算
10.1 原码一位乘
- 设机器字长为 n + 1 位,数值部分占 n 位
- 符号位“乘数”和“被乘数”的符号位异或来决定
- 数值位
- 被乘数和乘数通过 n 轮加法、移位完成,根据当前乘数中参与运算的位确定 ACC 应该加什么
- 若当前运算位值为 1,则
- 若当前运算位值为 0,则
- 每轮加法结束后, 中的内容统一逻辑右移一位
10.2 补码一位乘
- 设机器字长为 n + 2 位,数值位占 n 位
- 符号位参与运算
- 数值位
- 辅助位 - MQ 中最低位 = 1 时,
- 辅助位 - MQ 中最低位 = 0 时,
- 辅助位 - MQ 中最低位 = -1 时,
10.3 原码乘 VS 补码乘
- 符号位
- 原码:不参与运算,通过异或确定
- 补码:与数值位一起参与运算
- 数值位
- 原码:由被乘数、乘数的绝对值进行 n 轮加法、n 轮移位得到
- 补码:由被乘数、乘数进行 n 轮解法、n 轮移位,最后再多一次加法得到
- 加法
- 原码:可能
- 补码:可能
- 移位
- 原码:每次都是“逻辑右移”
- 补码:每次都是“补码的算术右移”
11 除法运算
11.1 原码除法
-
恢复余数法(默认被除数为 ,除数为 )
- 设机器字长为 n + 1 位,符号位占 1 位,数值位占 n 位
- 符号位单独处理
- 数值位取绝对值进行除法计算
- 若余数为负,则商 0,并 ,实现恢复余数,再将余数逻辑左移,进行下一步
- 若余数为正,则商 1,然后余数逻辑左移
-
加减交替法(不恢复余数法)(默认被除数为 ,除数为 )
- 设机器字长为 n + 1 位,符号位占 1 位,数值位占 n 位
- 符号位单独处理
- 数值位取绝对值进行除法计算
- 若余数为负,则商 0,并将余数逻辑左移,然后再
- 若余数为正,则商 1,并将余数逻辑左移,然后再
11.2 补码除法
- 符号位参与运算
- 被除数、除数、余数均为双符号位
- 被除数和除数同号,则被除数减去除数;否则被除数加上除数
- 若余数和除数同号,则商 1,余数逻辑左移移一位,然后减去除数
- 若余数和除数异号,则商 0,余数逻辑左移移一位,然后加上除数
- 以上步骤共重复 n 次
- 重复 n 次后,末位的商恒置为 1 (精度误差不会超过 )
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 表示
-
阶码:指明小数点后移、前移位数,通常是由补码、移码表示的定点整数
-
尾数:给出具体数值,通常是用补码、原码表示的定点小数
-
真值:
13.2 规格化
- 尾数的最高数值位必须是一个有效值(类比十进制科学计数法,通常我们会让数值部分最高位为非0)
- 左规:数值位最高位无效时,通过尾数算数左移、阶码减 1 的方法处理,直到尾数最高数值位有效时停止
- 右规:若采用双符号位表示尾数,则当运算后尾数“假溢出”"时,可以通过尾数右移、阶码加 1 的方法处理
- 原码表示的尾数规格化:尾数的最高数值位必须是 1
- 补码表示的尾数规格化:尾数最高数值位必须和尾数符号位相反
13.3 表示范围
14 浮点数标准 IEEE 754
14.1 浮点数结构
- 阶码部分用移码表示
- 尾数用原码表示,且隐藏表示最高位的 1,即 1.M
- 偏置值总是
- 由浮点数确定真值
- 根据“某浮点数”,确定数符、阶码、尾数的分布
- 确定尾数 1.M (最高位隐含 1)
- 确定阶码的真值 = 移码 - 偏置值(可将移码看做无符号数,用无符号数的值减去偏置值)
14.2 各类型的结构
14.3 浮点数的转换
【例 1】将十进制数 -0.75 转换为 IEEE 754 的单精度浮点数格式表示
【例 2】IEEE 754 的单精度浮点数 的真值是多少
14.4 表示范围
- 最小绝对值:尾数全为 0,阶码真值最小 -126,对应的移码机器数 0000 0001,此时整体的真值为
- 最大绝对值:尾数全为 1,阶码真值最大 127,对应移码机器数 1111 1110,此时整体的真值为
- 表示类型
- 常规浮点数: 时,真值
- 非规格化小数:阶码 E 全为 0,尾数 M 不全为 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 本章总结
-
图片总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通