csapp
2023年2月26日
信息的表示 #
整数 #
有无符号转换 #
- 二进制形式不变, 解释改变
- 运算规则
- 有符号转无符号:
x < 0 -> 2^k + x
;x >= 0 -> x
- 无符号转有符号:
x <= 2^(k-1) - 1 -> x
;x > 2^(k-1) - 1 -> x - 2^k
- 有符号转无符号:
正负切换 #
- 取反+1
小类型转大类型 #
- int转long, 无符号补0, 有符号补符号位
大类型转小类型 #
- long转int, 有符号无符号都是以二进制表示运算, 二进制截断即mod(2^k)再解释为有符号或无符号int类型
整数运算 #
- 无符号数加法溢出:
2^k - (x + y)
- 判断溢出:
sum < x
- 判断溢出:
- 有符号数
- 正溢出:
(x + y) - 2^k
- 负溢出:
(x + y) + 2^k
- 判断溢出
- x >=0, y>=0,
sum < 0
- x <=0, y<= 0,
sum > 0
- x >=0, y>=0,
- 正溢出:
- 乘法
- 二进制乘法截断后再解释为无符号数或有符号数
- 乘法转换为+/-, 例如
x * 14 -> x<<4 - x<<1
- 除法
- 无符号数逻辑右移, 有符号数算数右移
- 向0舍入
- 有符号数
x<0 ? x+(1<<k)-1 :x) >>k
, 偏置修正不能向0舍入 - 无法转为+/-
逆元 #
- 无符号数:
0 -> 0
;2^k - x
- 有符号数:
x > TMin -> -x
;TMin -> TMin
浮点数二进制表示 #
32位int类型转为浮点数的表示