CSAPP 2021-02-08
此文章的 撰写时间 可能有误
CSAPP Today:
——CSAPP 2.2.4专题:有符号数和无符号数之间的转换
这篇博客会更新一段时间。
一 有符号数转换到无符号数
考虑如下代码(摘自CSAPP)
1 | short int v = -12345; |
在采用补码的基础上 这段代码输出 v = -12345, uv = 53191
观察发现-12345的补码表示和53191的无符号表示是完全一样的。
也就是说,在C语言中 有符号到无符号转换时,底层的位模式是一样的。
用数学化的语言描述这个规则就是:
\[T2U_w(x)=B2U_w(T2B_w(x)), (TMin_w\leq x \leq TMax_w)\]
举个例子。\(T2U_4(-8)=B2U_4(T2B_4(-8))=B2U_4(11111000)=\text{(截取四位)}\quad B2U_4(1000)=8\)
还有一个简单的规律:负的有符号整数的绝对值与转换后的无符号整数之和为 \(2^w\), \(w\) 为(位模式的)位数,即 \(|x|+T2U_w(x)=2^w, x<0\) 例如,上面例子中 \(|-12345|+53191=65536=2^{16}\)。这样我们可以很快速算出负的有符号数换到无符号数:\(2^w-|x|\)
所以我们可以得到: \[ \begin{equation} T2U_w(x)= \left\{ \begin{array}{lr} x+2^w, & x<0 \\ x, & x\geq0 \end{array} \right. \end{equation} \] ## 未完待续(这里研究了好久才勉强看懂)