2.3 整数运算

 

 

 

 

 

算术运算: 基本规则

  • 加法:
    • 无/有符号数的加法: 正常加法后再截断,位级的运算相同
    • 无符号数:加后对2w求模
      • 数学加法 + 可能减去 2w
    • 有符号数: 修改的加后对 2w 求模,使结果在合适范围
      • 数学加法 + 可能减去或加上 2w
  • 乘法:
    • 无/有符号数的乘法:正常乘法后加截断操作,位级运算相同
    • 无符号数:乘后对2w求模
    • 有符号数: 修改的乘后对 2w 求模,使结果在合适范围内

 

 

 

 

  • 无符号整数、补码整数是同构环(isomorphic rings)
    • 同构 = 类型转换  (isomorphism = casting)
  • 左移
    • 无论有/无符号数,都可用逻辑左移实现乘以 2k
  • 右移
    • 无符号数: 逻辑右移,除以 2k (除法 +0舍入)
    • 有符号数: 算术右移
      • 正整数:除以 2k (除法 + 向0舍入)
      • 负整数:除以 2k (除法 + 远离0舍入),使用偏置来修正

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)

 

2.3.1 无符号加法

 

 

 

 

 

 

 

 

 

 

 

  • 操作数:w位
  • 真实和:w+1位
  • 丢弃进位后:w位

 

 

 

 

 

 

 

 

 

 

  • 数值面有弯折
  • 非饱和运算——不单调
  • 当真实和>=2^w时溢出
  • 最多溢出一次

 

 

 

 

 

 

 

2.3.2 补码加法

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)

 

 

 

  • 真实和需要w+1
  • 丢弃最高有效位(MSB)
  • 将剩余的位视作补码(整数)

 

 

 

 

 

 

 

 

 

 

 

计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)

 

 

 

 

 

 

 

 

 

 

判断补码是否超范围:

  • 正常: Xh != Yh Xh==Yh==Zh
  • 溢出: Xh==Yh != Zh

 

 

 

 

 

 

 

 

 

计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)

2.3.3 补码的非

注意:在w位最小值取非时,值不变

计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)

2.3.4 无符号乘法

w位和w位无符号数做乘法,2w位取低w位

即截断为w位,等价于该值模2^w

2.3.5 补码乘法

 

 

 

 

 

  • 标准乘法功能
    • 忽略高w位
    • 有符号数乘、无符号数乘有不同之处:
      •  乘积的符号扩展
    • 乘积的低位相同

 

 

 

 

计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)

 

 

 

2.3.6 乘以常数

 

 

 

 

 

  • 乘法指令很慢
  • 移位+加法---代替--->乘法
  • 重点考虑乘以2的幂

 

优化

 

 

 

2.3.7 除以2的幂

算术右移k位=除以2的k次方

2.3.8 关于整数运算的最后思考

  • 一定要知道隐含的转换规则,否则不要用:
    • 常见错误
      • unsigned i;
      • for (i = cnt-2; i >= 0; i--)
      •   a[i] += a[i+1];
    • 不易察觉的问题
      • #define DELTA sizeof(int)     //sizeof()类型unsigned
      • int i;
      • for (i = CNT;  i - DELTA >= 0; i -= DELTA)
      •   . . .

2.4 浮点数

2.4.1 二进制小数

 

 

 

 

 

 

 

 

 

 

 

计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)

 

 

  • 表示的有理数:    ????=−????????????????×2????计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)
  • “小数点”右边的位代表小数部分

 

 

 

 

 

 

 

 

局限性

  • 近似表示
    • 只能精确表示形如 x/2k的数值
    • 其他有理数的二进制表示存在重复段
    • 数值    二进制表示
      • 1/3    0.0101010101[01]2
      • 1/5    0.001100110011[0011]2
      • 1/10    0.0001100110011[0011]2
  • 在计算机内的实现问题
    • 长度有限的w位
    • 只能在w位内设置一个二进制小数点
    • 限制了数的范围
  • 定点数
    • 小数点隐含在w位编码的某一个固定位置
    • 例如MSB做符号位,隐含后面是小数点,表示小于1.0的纯小数123.456怎么办???

 

 

 

 

2.4.2 IEEE浮点表示

IEEE标准754

  • 快速、易于实现
  • 精度损失小
  • 优雅、易理解
  • 所有主流CPU都支持
  • 之前有很多不同格式、不太关注精确性
计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)

 

 

 

 

 

 

 

计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)

 

  • 尾数(Significand) 编码隐含先导数值1: M  =  1.xxx…x
    •  xxx…x: 是 frac字段的数码
    • frac=000…0 (M = 1.0)时,为最小值
    • frac=111…1 (M = 2.0 – ε)时,为最大值
    • 额外增加了一位的精度(隐含值1)
      • 非规则化没有默认1.xxx
  • 条件:exp≠000…0 exp≠111…1
  • 阶码采用偏置值编码:
    • E=Exp-Bias
    • Exp:exp字段的无符号数值
    • Bias偏置:2k-1 - 1,  k 为阶码的位数
      • 单精度:127 (Exp: 1…254, E: -126…127)
      • 双精度: 1023 (Exp: 1…2046, E: -1022…1023)
  • 规则化数

 

 

 

 

  • 条件: exp = 000…0
    • 阶码(Exponent) 值: E = 1 – Bias =-126/-1022(instead of E = 0 – Bias)
    • 尾数(Significand)编码隐含先导数值0: M = 0.xxx…x2
      • xxx…x:是 frac字段的数码
  • 情况1: exp = 000…0, frac = 000…0
    • 表示值0
    • 注意有不同的数值 +0 和 –0 (why?)
  • 情况2:exp = 000…0, frac ≠ 000…0
    • 最接近0.0的那些数
    • 间隔均匀
    • 逐渐下溢
  • 非规则化数
  • 条件:阶码全为1,exp = 111…1
  • 当小数域全为0,frac=000…0
    • 当s=0时
      • 值:+∞
    • 当s=1时
      • 值:-∞
  • 当小数域非0
    • NaN(Not a Number)
  • 特殊值
计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)

2.4.3 数字实例

计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理(2.3-2.4)

规格化浮点数表示范围

  • 单精度:
    • 约 +3.4 X 1038
  • 双精度
    • 约 +1.8 X 10308

2.4.4 舍入

  • 基本思想
    • 首先,计算精确结果
    • 然后,变换到指定格式
      • 可能溢出阶码太大
      • 小数部分可能需要舍入

默认:向偶数舍入

  • 其他方法都有统计偏差,对正整数集合求和时,和将始终被低估或高估(负偏差、正偏差)
  • 当恰好在两个可能的数值正中间时(中间值):
    • 舍入后,最低有效位的数码为偶数,即最低有效位值为0
      • 7.8950000        7.90        (中间值—向上舍入)
      • 7.8850000        7.88        (中间值—向下舍入)
  • 其他时候:
    • 向最近的数值舍入
    • 比中间值小向下舍入,比中间值大向上舍入
      • 7.8949999        7.89        (比中间值小:向下舍入)
      • 7.8950001        7.90        (比中间值大:向上舍入)

2.4.5 浮点运算

 

 

 

 

 

浮点数加法

  • (–1)s1 M1  2E1   +   (-1)s2 M2  2E2
    • 假设 E1 > E2
  • 准确结果: (–1)s M  2E
    • 符号 s, 尾数M:
      • 有符号数对齐、相加的结果
    • 阶码(Exponent) E:     E1
  • 修正
    • M ≥ 2:将M右移(1位),E加1
    • M < 1:将M左移k 位, E 减 k
    • E超范围:溢出
    • 将M舍入,以符合小数部分的精度要求
  • 数学性质:
    • 封闭性
    • 交换性
    • 分配性 No!
      • 溢出和舍入的不确定性
        • (3.14+1e10)-1e10 = 0
        • 3.14+(1e10-1e10) = 3.14
    • 单调性
      • a ≥ b ⇒ a+c ≥ b+c
      • 除了无穷和NaN

 

浮点数乘法

  • (–1)s1 M1  2E1   x   (–1)s2 M2  2E2
  • 精确结果: (–1)s M  2E
    • 符号(Sign) s:         s1 ^ s2
    • 尾数(Significand) M:     M1 x  M2
    • 阶码(Exponent) E:     E1 + E2
  • 修正
    • M ≥ 2, M右移(1), E1
    • E 超出范围,则溢出
    • M舍入,以符合小数部分的精度要求
  • 实现
    • 主要问题:实现尾数的乘
  • 数学性质
    • 封闭性
      • 但可能产生无穷或NaN
    • 交换性
    • 结合性 No!
      • 可能溢出、舍入不精确
        • (1e20*1e20)*1e-20= inf
        • 1e20*(1e20*1e-20)= 1e20
    • 1是乘法的单位元
    • 乘法对加法的分配性?No
      • 可能溢出、舍入不精确
        • 1e20*(1e20-1e20)= 0.0
        • 1e20*1e20 – 1e20*1e20 = NaN
    • 单调性
      • a ≥ b  & c ≥ 0  a * c ≥ b *c?
      • 除了无穷和NaN

 

 

 

2.4.6 C语言的浮点数

  • 两种精度
    • float    单精度
    • double    双精度
  • 类型转换
    • int, float, double 间转换,将改变位模式
    • double/float → int
      • 截掉小数部分
      • 类似向0舍入
      • 当数值超范围或NaN时无定义:通常设置为 TMin
    • int → double
      • 精确转换,只要int的位宽 ≤ 53 bit,即可精确转换
    • int → float
      • 将根据舍入模式进行舍入

 

相关文章:

  • 2022-01-26
  • 2021-04-21
  • 2021-10-27
  • 2021-08-31
  • 2021-04-25
  • 2021-11-29
  • 2021-12-09
  • 2021-08-30
猜你喜欢
  • 2021-06-04
  • 2021-06-27
  • 2021-08-27
  • 2021-06-07
  • 2021-12-27
  • 2021-10-28
  • 2021-10-20
相关资源
相似解决方案