码迷,mamicode.com
首页 > 其他好文 > 详细

《深入理解计算机系统》2.3整数的运算

时间:2015-09-03 21:37:49      阅读:388      评论:0      收藏:0      [点我收藏+]

标签:

无符号加法

对于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?12w?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取整的

所以为了得到零舍入的结果,在运算前需要对被除数进行"偏置"
技术分享

技术分享

总结

技术分享





《深入理解计算机系统》2.3整数的运算

标签:

原文地址:http://www.cnblogs.com/Recoding/p/4780651.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!