整形变量Integer
类型拓展与截取
无符号数的零拓展:无符号数转换为更大的数据类型,只需要在开头添加0即可,这种运算也被称为零拓展。
**补码数的符号拓展:**补码数转换为更大的数据类型需要在开头添加最高有效位的值,即:如果为负数,需要在拓展出来的开头位置添加数个1,正数需要添加数个0。
截断数字
当我们将一个位数为 w 的数字截断为 k 位的数字时,我们会丢弃最高的w-k位。
**截断无符号数:**相当于做mod运算,x′=x mod 2k
**截断补码数值:**和无符号值相似,不过需要将最高位转换为符号位
运算与溢出
无符号数字加法:溢出时会丢弃最高位,实际上相当于做了个mod操作
x+wuy={x+y,x+y<2wx+y−2w,2w≤x+y<2w+1
检测无符号数是否溢出:当s<x或s<y时发生了溢出
补码加法:溢出时会产生正溢出和负溢出,正溢出是数字太大,把符号位改成了1而变成了负数,负溢出为数字太小把符号位改成了0而变成了正数
对于满足−2w−1≤x,y<2w−1的整数,有:
x+wty=⎩⎪⎨⎪⎧x+y−2w,2w−1≤x+y正溢出x+y,−2w−1≤x+y<2w−1正常x+y+2w,x+y<−2w−1负溢出
对于乘法来说,值的范围会大很多,这里分情况讨论一下,假设两个乘数是 x,y 并且都是 w 位的:
- 无符号数:至多 2w 位
- 范围$ 0≤x×y≤(2w−1)2=2{2w}−2^{w+1}+1$
- 有符号数,最小的负数:至多 2w - 1 位
- 范围x×y≥(−2w−1)×(2w−1−1)=−22w−2+2w−1
- 有符号数,最大的正数:至多 2w 位,只有(TMinw)2一种情况
- 范围 x×y≤(−2w−1)2=22w−2
如果需要保证精度,就需要用软件来实现了。另外,计算的无符号乘法的时候,会忽略最高的 w 位,相当于 UMultw(u,v)=u⋅v mod 2w
今日体重