0%

CSAPP阅读笔记2——数据编码2

整形变量Integer

类型拓展与截取

无符号数的零拓展:无符号数转换为更大的数据类型,只需要在开头添加0即可,这种运算也被称为零拓展。

补码数的符号拓展:补码数转换为更大的数据类型需要在开头添加最高有效位的值,即:如果为负数,需要在拓展出来的开头位置添加数个1,正数需要添加数个0。

截断数字

当我们将一个位数为 w 的数字截断为 k 位的数字时,我们会丢弃最高的w-k位。

截断无符号数:相当于做mod运算,\(x'=x\ mod\ 2^k\)

截断补码数值:和无符号值相似,不过需要将最高位转换为符号位

运算与溢出

无符号数字加法:溢出时会丢弃最高位,实际上相当于做了个mod操作 \[ x+^u_wy= \left\{ \begin{array}{l} x+y,\quad x+y<2^w\\ x+y-2^w, \quad 2^w\leq x+y<2^{w+1}\\ \end{array} \right. \] 检测无符号数是否溢出:当\(s<x\)\(s<y\)时发生了溢出

补码加法:溢出时会产生正溢出和负溢出,正溢出是数字太大,把符号位改成了1而变成了负数,负溢出为数字太小把符号位改成了0而变成了正数

对于满足\(-2^{w-1} \leq x,y<2^{w-1}\)​的整数,有: \[ x+^t_wy = \left\{ \begin {array}{l} x+y-2^w,\qquad 2^{w-1} \leq x+y\qquad \quad 正溢出\\ x+y,\qquad -2^{w-1}\leq x+y < 2^{w-1}\qquad 正常\\ x+y+2^w,\quad x+y<-2^{w-1} \qquad \quad负溢出 \end{array} \right. \] 对于乘法来说,值的范围会大很多,这里分情况讨论一下,假设两个乘数是 x,y 并且都是 w 位的:

  • 无符号数:至多 2w 位
    • 范围$ 0≤x×y≤(2w−1)2=2{2w}−2^{w+1}+1$
  • 有符号数,最小的负数:至多 2w - 1 位
    • 范围\(x×y≥(−2^{w−1})×(2^{w−1}−1)=−2^{2w−2}+2^{w−1}\)
  • 有符号数,最大的正数:至多 2w 位,只有\((TMin_w)^2\)一种情况
    • 范围 \(x×y≤(−2^{w−1})^2=2^{2w−2}\)

如果需要保证精度,就需要用软件来实现了。另外,计算的无符号乘法的时候,会忽略最高的 w 位,相当于 \(UMult_w(u,v)=u⋅v\ mod\ 2^w\)

今日体重

image-20210808001824599

请我喝咖啡