有符号数和无符号数
date
Aug 12, 2021
slug
Signed-and-unsigned-numbers
status
Published
tags
CSAPP
type
Post
summary
Signed and unsigned numbers
有符号数和无符号数的转换
有符号数转换成无符号数
$$
x=
\begin{cases}
x + 2^w & \text{x<0}\\
x& \text{x>=0}
\end{cases}
$$
无符号数转补码
$$
x=\begin{cases}
x & \text{x<=Tmax}\\
x - 2^w& \text{x>Tmax}\end{cases}
$$
无符号和补码的关系
$$
1 + UMax = 2^w
$$
有符号数和无符号数的运算
当执行一个运算是,如果一个运算数是有符号的另一个是无符号的,
c
隐式地将无符号数转换成有符号数拓展一个数字的位表示
在不同字长的整数之间转换(小类型 -> 大类型)
无符号 -> 零拓展
在开头添加0
有符号 -> 符号拓展
在开头添加最高有效位的值
因为
$$
2^w - 2^{w - 1} = 2^{w - 1}
$$
所以运算的综合效果和原来一样 (
csapp
P55 )截断一个数字的位表示
无符号数
把α位的数字x截断为w位,其实是
x mod 2^w
有符号数
把α位的数字x截断为w位,其实是无符号数--> 有符号数再mod,
(T2U)x mod 2^w
建议
不要使用无符号数
不过当无符号数是位的集合而不表示数字的时候还是很好用的。
隐式转换的隐患(例子)
当
length
是0的时候,出现错误