csapp

csapp

2023年2月26日
csapp
202302, csapp

信息的表示 #

整数 #

有无符号转换 #

  1. 二进制形式不变, 解释改变
  2. 运算规则
    1. 有符号转无符号: x < 0 -> 2^k + x; x >= 0 -> x
    2. 无符号转有符号: x <= 2^(k-1) - 1 -> x; x > 2^(k-1) - 1 -> x - 2^k

正负切换 #

  1. 取反+1

小类型转大类型 #

  1. int转long, 无符号补0, 有符号补符号位

大类型转小类型 #

  1. long转int, 有符号无符号都是以二进制表示运算, 二进制截断即mod(2^k)再解释为有符号或无符号int类型

整数运算 #

  1. 无符号数加法溢出: 2^k - (x + y)
    1. 判断溢出: sum < x
  2. 有符号数
    1. 正溢出: (x + y) - 2^k
    2. 负溢出: (x + y) + 2^k
    3. 判断溢出
      1. x >=0, y>=0, sum < 0
      2. x <=0, y<= 0, sum > 0
  3. 乘法
    1. 二进制乘法截断后再解释为无符号数或有符号数
    2. 乘法转换为+/-, 例如 x * 14 -> x<<4 - x<<1
  4. 除法
    1. 无符号数逻辑右移, 有符号数算数右移
    2. 向0舍入
    3. 有符号数 x<0 ? x+(1<<k)-1 :x) >>k, 偏置修正不能向0舍入
    4. 无法转为+/-

逆元 #

  1. 无符号数: 0 -> 0; 2^k - x
  2. 有符号数: x > TMin -> -x; TMin -> TMin

浮点数二进制表示 #

32位int类型转为浮点数的表示 float_principle