有符号数和无符号数

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} $$ 所以运算的综合效果和原来一样 (csappP55 )

截断一个数字的位表示

无符号数

把α位的数字x截断为w位,其实是x mod 2^w

有符号数

把α位的数字x截断为w位,其实是无符号数--> 有符号数再mod,(T2U)x mod 2^w

建议

不要使用无符号数
不过当无符号数是位的集合而不表示数字的时候还是很好用的。

隐式转换的隐患(例子)

length是0的时候,出现错误

© dana 2023 - 2025