CSAPP 第二章主要讲述了整数和浮点数在计算机中的存储与运算方式,及计算机内部表示信息的方式。
2.2 整数表示
2.2.2 无符号数的编码
考虑一个二进制数值编码 x 由 w 位组成,则我们可以将其拆为由 w 位 0 或 1 表示的位向量 x:
x=[xw−1,xw−2,⋯,x0],xi∈{0,1},i∈[0..w−1]
显然地,一个位向量和一个无符号数编码一一对应;定义函数 B2Uw,它将位向量转换成对应的无符号数编码:
B2Uw(x)=i=0∑w−1xi2i
考虑 w 位无符号数编码的取值范围:当 w 位全为 0 时,编码取得最小值 UMinw=0;当 w 位全为 1 时,编码取得最大值,为 UMaxw=2w−1。
考虑函数 B2Uw 显然是双射,因此随着 w 位无符号数编码按字典序从 wzeros000⋯0 向 wones111⋯1 遍历,对应的整数值也恰好取遍从 0 到 2w−1 的每一个值。因此,B2Uw 是一个双射 {0,1}w→{0,⋯,2w−1}。
相应地,我们也可定义 B2Uw 的反函数 U2Bw:它将一个 w 位无符号数编码映射成对应的位向量。
2.2.3 补码编码
无符号数只能表示非负整数。为了表示负数值,我们选择将 w 位编码的最高位解释为负权(negative weight),称为符号位。并定义:当符号位为 1 时,代表数值为负;当符号位为 0 时,代表数值为 0 或正。我们称这种编码形式为(二)补码(two’s-complement)。相应地,我们定义函数 B2Tw,它将位向量转换成对应的补码编码:
B2Tw(x)=−xw−12w−1+i=0∑w−2xi2i
从定义中我们可以看到:在补码编码中,低 (w−1) 位代表的数值仍大于等于 0,而整个数值的负号来源是最高位代表的数值 −2w−1;这是由于最高位的权重最大,对最高位和低 (w−1) 位总有 ∣−2w−1∣>i=0∑w−21⋅2i=2w−1−1≥i=0∑w−2xi2i,因此只要符号位设为 1,整个数值就一定为负。
由此可以得出 w 位补码编码的取值范围:当符号位为 1 且低 (w−1) 位全为 0 ,即编码为 1w−1zeros00⋯0 时,代表的数值最小,为 TMinw=−2w−1;当负权被设为 0,低 (w−1) 位全为 1,即编码为 0w−1ones11⋯1 时,代表的数值最大,为 TMaxw=2w−1−1。
同样易知 B2Tw 是双射 {0,1}w→{−2w−1,−2w−1+1,⋯,2w−1−1},因此可以定义 B2Tw 的反函数 T2Bw。

容易注意到以下两点:
-
∣TMinw∣=∣TMaxw∣+1
∣TMinw∣ 没有与之对应的正数,这种不对称性是因为符号位设置为 0 或 1 将 w 位补码的数值表示范围分为两半,其中符号位为 1 时表示的为负数,符号位为 0 时表示的为非负数(包括 0)。0 占去了对应 ∣TMinw∣ 的位置。
-
UMaxw=2TMaxw+1。