学海泛舟

第2章 信息的表示和处理(二)

2.3 整数运算

2.3.1 无符号加法

对于两个限定范围的非负整数,它们的和通常处于一个更大的范围之中。编程语言支持限定精度的运算,故定义一种无符号数加法的运算$+^u_w$

无符号数加法
对满足$0 \leq x, y < 2^w$的x和y有:
$$x +^u_w y = \begin{cases}x + y, & x + y < 2^w \\x + y - 2^w, & 2^w \leq x + y < 2^{w+1}\end{cases}$$

只要检验无符号数加法后的结果是否比原来的两个加数小,就能够判定结果是否发生了溢出

2.3.2 补码加法

补码进行运算的时候,同样存在溢出的问题,但补码存在正负问题,形势相对复杂一些。

补码加法
对满足$-2^{w-1} \leq x, y \leq 2^{w-1} - 1$的整数x和y,有:
$$x +^t_w y = \begin{cases}x + y - 2^w, & 2^{w-1} \leq x + y \\x + y, & -2^{w-1} \leq x + y < 2^{w-1} \\x + y + 2^w, & x + y < -2^{w-1}\end{cases}$$

虽然区分无符号加法和补码加法,但是两者从位级的角度来看是相同的。这是因为对位级而言,两者都是相加后截取w位的结果。

如果x>0,y>0,但补码加法后<0,则发生了正溢出,如果x<0,y<0,但补码加法后>0,则发生了负溢出。

2.3.3 补码的非

对于$TMin_w \leq x \leq TMax_w$中的数字x,其在补码加法下的加法逆元,一般为-x,但是注意到$-TMin_w = TMax_w + 1$,这时我们从定义出发,$TMin_w$的加法逆元就是其本身。

2.3.4 无符号乘法

无符号乘法从位级上来看,仍和之前的加法类似,直接相乘的基础上截取低w位。

无符号数乘法
对满足$0 \leq x, y \leq UMax_w$的x和y有:
$$x *^u_w y = (x \cdot y) mod 2^w$$

2.3.5 补码乘法

无论是无符号乘法还是补码乘法,它们的位级表示是一样的,

补码乘法
对满足$Tmin_w \leq x, y \leq TMax_w$的x和y有:
$$x *^t_w y = U2T_w((x \cdot y)mod 2^w)$$

2.3.6 乘以常数

整数乘法指令相比于其他整数运算慢得多,故编译器会尝试用位移和加法运算代替乘以常数的运算。
通过位移运算,能够迅速计算乘以2的幂的结果,那么将要乘的数分解为2的幂的和,再通过乘法分配律,就能用位移运算和加法运算表示乘以任意一个常数的运算了。

2.3.7 除以2的幂

整数除法比整数乘法更慢。
除以2的幂也可以用位移运算实现。
无符号除法使用的是逻辑右移。
补码除法,使用算数右移,效果为向下舍入。这种舍入,在为负数时,就造成了右移和除以2的幂结果不相等的情况。为了解决这个问题,可以通过移位前偏置这个值来修正。具体的做法也很简单,假设除以的时2的k次幂,那么在右移前先给原数加上(1<<k)-1。

2.4 浮点数

目前,所有计算机都支持IEEE浮点为标准。

2.4.1 二进制小数

二进制小数的概念类比于十进制小数。
形如$b_mb_{m-1} \ldots b_1b_0 \ldotp b_{-1}b_{-2} \ldots b_{-n-1}b_{-n}$这样的二进制小数,表示的数b
$$b = \sum^m_{i=-n}2^i \times b_i$$

2.4.2 IEEE浮点表示

IEEE浮点标准用$V = (-1)^s \times M \times 2^E$表示一个数:

  • 符号 s的取值(0或者1)决定了这个数的正负
  • 尾数 M是一个二进制小数
  • 阶码 E是一个权值

这种表示方法其实类似于科学记数法,当然限于存储的位数和表示的本身,浮点数的精度是有限的,正如1/3也不可能用科学计数法精确表示。

当把这种标准具体到实际,情况要稍微复杂一些。
浮点数的位划分为三个字段:

  • 符号位s编码为符号s(直接编码)
  • k位的阶码字段exp编码为阶码E
  • n位小数字段frac编码位尾数M

根据exp的值,exp和frac的编码方式是不同的,这要划分为三种不同的情况:

  • 规格化的值
    当exp的位模式既不全是0,也不全是1,就是这种情况。
    此时,阶码E=e-Bias,其中e是一个无符号数,其位模式就是exp,Bias是$2^{k-1}-1$;尾数M=1+f,其中f的位模式是0.frac(就是在frac的位模式前面加上一个0和一个小数点)。

  • 非规格化的值
    当exp的位模式全为0时,表示的就是非规格化的值。
    此时,E=1-Bias,M=f。

  • 特殊值
    当exp的位模式全为1时,就是特殊值,其实就两种,无穷大和NaN。
    当frac全为0时,代表无穷大,否则就是NaN(不是一个数)。

2.4.4 舍入

面对实数运算时,浮点数面临了精度问题,而舍入就是在限制条件下,找到一个最接近的匹配值。IEEE浮点格式定义了四种舍入方式。

  • 向偶数舍入:这种舍入方式总是舍入为最接近该数的数,例如1.4舍入为1,3.6舍入为4。当遇到中间值时,如1.5,就朝舍入后最低有效为偶数的方向舍入,如1.5舍入为2,4.5舍入为4。
  • 向零舍入:就是朝零的方向舍入,即正数向下舍入,负数向上舍入。
  • 向下舍入
  • 向上舍入

默认采用向偶数舍入。

2.4.5 浮点运算

浮点加法具有交换性,单调性,但不具备结合性。
浮点乘法具有交换性,有单调性,但没有对加法的分配性。