0%

学习CSAPP(2)-数据的表示

学习CSAPP(2)-数据的表示

二进制转无符号整型

\[ B2U_w(x) = \sum_{i=0}^{w-1} x_i2^i \tag{1} \]

二进制转有符号整型

\[ B2T_w(x) = -x_{w-1}2^{w-1} + \sum_{i=0}^{w-2}x_i2^i \tag{2} \]

最高位是符号位,解释为负权。

无符号整型与有符号整型之间互相转换

无符号数和有符号数之间转换只是改变了对二进制数据的解释方式。先假设我们有一个8位的无符号整型数据x,要将该数据转换为有符号数据,x的二进制表示如下:

\[ x_0 x_1 x_2 x_3 x_4 x_5 x_6 x_7 \]

按照公式(1)(2),将x转换为有符号数据之后,最高位会被解释为符号位,在公式(2)中被解释为负权,因此,若x的最高位x0(符号位)为0,那么转换结果依旧是x本身(可以观察到公式(1)(2)的非符号位解释方式是一样的)。

若符号位\(x_0\)是1,(这时候x的无符号表示应该大于或等于\(x^{w-1}\))事情就开始变得有趣了,观察公式(2):

\[ B2T_w(x) = -x_{w-1}2^{w-1} + \sum_{i=0}^{w-2}x_i2^i \tag{2} \]

将这个公式改写为\(w=8\)的情况:

\[ B2T_8(x) = -x_{7}2^{7} + x_{6}2^{6} + x_{5}2^{5} + x_{4}2^{4} + x_{3}2^{3} + x_{2}2^{2} + x_{1}2^{1} + x_{0}2^{0} \tag{3} \]

注意到,这个公式的后半部分其实跟公式(2)在\(w=7\)情况下的公式是一样的:

\[ B2U_8(x) = x_{7}2^{7} + x_{6}2^{6} + x_{5}2^{5} + x_{4}2^{4} + x_{3}2^{3} + x_{2}2^{2} + x_{1}2^{1} + x_{0}2^{0} \tag{4} \]

由于这时候我们的符号位,当x的无符号表示\(B2T_8(x) \ge 2^{7}\)时,因此公式(3)(4)可以进一步改写为:

\[ B2T_8(x) = -2^{7} + x_{6}2^{6} + x_{5}2^{5} + x_{4}2^{4} + x_{3}2^{3} + x_{2}2^{2} + x_{1}2^{1} + x_{0}2^{0}\tag{5} \]

\[ B2U_8(x) = 2^{7} + x_{6}2^{6} + x_{5}2^{5} + x_{4}2^{4} + x_{3}2^{3} + x_{2}2^{2} + x_{1}2^{1} + x_{0}2^{0} \tag{6} \]

于是

\[ B2U_8(x) - B2T_8(x) = 2^{7} + 2^{7} = 2^{8} \tag{7} \]

因此

\[ B2T_8(x) = B2U_8(x) - 2^{8}\tag{8} \]

也即

\[ U2T_w(x) = x - 2^{w}\tag{9} \]

综合考虑,得到无符号转有符号的公式:

$$ \[\begin{align*} U2T_w(x) = \begin{cases} x&,n < 2^{w-1} \\ x - 2^w&,x \ge 2^{w-1} \end{cases} \tag{10} \end{align*}\] $$

同样地,继续从公式(7)出发,能够推导出有符号整型转无符号整型的公式:

\[ B2U_8(x) = B2T_8(x) + 2^{8}\tag{11} \] 因为这时候是有符号转无符号,因此公式(7)(11)的条件变为了:当x的有符号表示\(B2T_8(x) < 0\)(符号位为1)时: $$ \[\begin{align*} T2U_w(x) = \begin{cases} x&,x \ge 0 \\ x + 2^w&,x < 0 \end{cases} \tag{12} \end{align*}\] $$ 公式(12)就是最终的有符号整型转无符号整型的公式了。

浮点表示

TODO...