无符号加法
对于w位数字,它的取值范围是(0,2w?1)。如果两个这样的数字相加,其结果的取值范围将为(0,2w+1)。那么对于固定字长的数据类型,将可能丢弃最高位
无符号加法等价于计算和再模上2w
例如
x=9:[1001]
y=12:[1100]
其和为21:[10101]
由于字长固定,故丢弃最高位:[0101]即5
以上等价于(9+12)% 24 =5
显然如果s=x+y当((s<x)||(s<y))时,可以说计算溢出。此时表达式为
s=x+y-2w
加法逆元
补码加法
补码加法实际是把补码变无符号,再用无符号加法,结果再变成补码。
这个过程也会有超出取值范围的情况
下面是数据溢出时的情况
一个w位的补码取值范围:?2w?1,2w?1
图左边:是两个w位补码相加可能的取值范围,图右边:对应于左边取值范围结果的取值范围
最后公式:
补码的非
公式:
补码非的位表示
有两种方法能算出补码的非
- 每一位取反再+1
- 最右边的1的左边全取反
无符号乘法
乘法会溢出
补码乘法
补码乘法也会溢出
乘法结果截断后与无符号相同
说明机器可以用一条指令进行无符号和补码的乘法
乘以常数
乘法运算可能要10个左右的时钟周期,位移运算和加减法运算只用一个时钟周期
所以对于乘以常数运算,计算机采用位移和加法代替
比如
X*14
等价于(x<<3)+(x<<2)+(x<<1)
对于X*K(K为常数)
编译器会把K变为[000000 1111 000 111 ]
把连续的1归为一组
上述的例子有两组
分别是0~2的1,6~9的1
可以使用形式计算
- ((X<<9)+(x<<8)+(x<<7)+(x<<6))+((x<<2)+(x<<1)+(x<<0))
- ((X<<10)-(X<<6))+((X<<3)+(X<<0))
原文
除以2的幂
补码使用算术右移
无符号使用逻辑右移
x/2^n===>x>>n
对于x>=0,y>0通常的计算结果是
但是对于负数的位移,舍去小数的时候将产生不想要的结果
上图舍入后结果是向下取整的,但是我们要的是向0取整的
所以为了得到零舍入的结果,在运算前需要对被除数进行"偏置"
总结
时间: 2024-10-16 17:25:57