1585 字
8 分钟
数字的表示与运算
进位计数制与相互转换
进位计数法
进制转换
- B -> O 或者 B -> H 三位/四位一组,对应右边一位
- O -> B 或者 H -> B 左边一位对应右边三/四位
- D -> *
- 除N取余,逆序输出
- 乘N取整,正序输出
- -> D 按权展开
无符号整数的表示
…
有符号整数的表示
概念
- 真值 表示的值
- 机器数 数据重新用无符号整数解释的值
- 定点小数 约定小数点在符号位后
- 定点整数 约定小数点在最后
四种编码方法
原码
反码
补码
- 同余
- 手动真值机器码互转,即相同数据用补码与无符号的的不同解释(假设数字宽度为)
- 真值转机器码 正数不变,负数加上,即为机器码
- 机器码转真值 把机器码按权展开成十进制,是大于的数字要减去
- 可以利用被转数字与某个特殊数字的和差关系简化运算
- 变形补码 扩大了补码的表示范围,实现溢出判断,只在ALU中才可能出现,存储格式还是补码,可以看作宽度宽一位的补码整数,不过范围里有些数字是非法的,是溢出的结果
移码
对应的无符号数减去一个偏置量(通常为 为数字的宽度)即为移码的真值
不同宽度的整数的转换
- 小到大
- 无符号 0扩展
- 有符号 符号拓展
- 大到小
- 截断
相同宽度的有符号与无符号数的转换
内容不变重新解释
定点数运算
比较运算
- 无符号数的比较 直接比较即可
- 所有最高位为1的数字小于所有最高位为0的数字,如果最高位相同,还是按照无符号数的比较规则进行比较
移位运算
- 逻辑移位 右移出1丢失精度,左移出1溢出
- 算术移位 左移操作与逻辑移位相同,一旦移出了和原标志位相反的位则溢出(如正数移出1,负数移出0),右移移出1丢失精度
- 循环移位
加减运算
溢出判断
- 双符号位
- 输入输出符号位不同
- 最高位进位与次高位进位不同
电路实现
ALU标志位
- ZF
- OF 仅对有符号运算有意义
- CF 仅对无符号运算有意义
- SF

手算
直接用真值运算,如果没给出真值,则用对应的机器码看作无符号数运算,运算结果是一样的
乘法运算
对于补码与无符号数乘法,n位乘以n位得到n位的结果的小乘法运算有相同的位级表现,但是对于n位乘以n位得到2n位的结果的大乘法运算有不同的位级表现
原码乘法
乘法溢出判断
输入两个宽度为的整数,输出宽度为的结果
- 对于无符号数,高位为0
- 对于补码表示的有符号数,高位的每一位都相同等于低位的符号位
手算
两个操作数转成真值,两个相乘得到结果的真值再转成机器数
除法运算
数据的存储和排列
字节序
- LSB(the Least Significant Bit)
- MSB(the Most Significant Bit)
- 小端序 一个跨越了多个字节的数据存储时,首个字节是LSB 现代指令集通常选用的字节序 一个指向数字的指针天然的是一个指向更低宽度的数字的指针 鸡蛋的小头
- 大端序 一个跨越了多个字节的数据存储时,首个字节是MSB 网络字节序 人类的数字表示法 鸡蛋的大头
内存对齐
- 结构体对齐规则
- 非对齐访问导致访存效率变低,需要锁住总线保证访存原子性或者不能保证原子性,是未定义或者是低效的
浮点数
表示
- S与M 构成小数原码表示法,S是符号,M是大小
- E通常用移码表示,如果E的宽度为N,那么偏置值一般是
- 规格化 ,增加表示的有效位数
IEEE754

| 类型 | 符号位 | 阶数 | 阶数偏置值 | 尾数 | 规格化浮点数的真值 | 有效位数 |
|---|---|---|---|---|---|---|
| f32 | 1 | 8 | 127 | 23 | 24 | |
| f64 | 1 | 11 | 1023 | 52 | 53 |
- 阶数全0与全1有特殊含义,规格化的浮点数不能用
特殊的值
| 符号 | 阶数 | 尾数 | 真值 | |
|---|---|---|---|---|
| ±0 | 0/1 | 全0 | 全0 | |
| ±非规格化的浮点数 | 0/1 | 全0 | 非全0 | f32: ,f64: |
| ±inf | 0/1 | 全1 | 全0 | |
| nan | 0/1 | 全1 | 非全0 |
特殊值的比较运算
- 不考虑nan,+inf大于一切除了+inf的数字,-inf小于一切除了-inf的数字
- +0 等于 -0
- nan参与的一切比较运算都返回false
- 对于规格化的浮点数的比较的比较规则与原码比较规则一致
最大安全整数
f32::MAX_SAFE_INTEGER === 2 ** 24 - 1 f64::MAX_SAFE_INTEGER === 2 ** 53 - 1 再大的整数就不能精确表示了
浮点数与整数的转换
- i32 -> f32: 不会溢出,可能精度丢失
- i32 -> f64: 不会溢出,不会精度丢失
- i64 -> f32: 不会溢出,可能精度丢失
- i64 -> f64: 不会溢出,可能精度丢失
- f64 -> i32: 可能溢出,可能精度丢失
- f64 -> i64: 可能溢出,可能精度丢失
- f32 -> i32: 可能溢出,可能精度丢失
- f32 -> i64: 可能溢出,可能精度丢失
加减运算
- 对阶 小阶对大阶,FPU内部浮点暂存器宽度大于存储宽度,所以尾数右移移出的位不要舍掉,一同参与运算

- 加减运算
- 规格化
- 右规约 至多规约一位,可能要考虑到上溢出与舍入
- 左规约 可能移动多位,可能出现下溢出
- 舍入
- 就近舍入
- 向正无穷舍入
- 向负无穷舍入
- 向0舍入(截断)
- (指数)溢出
- 上溢出 抛出异常
- 下溢出 结果作为0处理
