首页 > 其他 > 详细

深入理解计算机系统第二章家庭作业

时间:2015-10-21 00:09:01      阅读:344      评论:0      收藏:0      [点我收藏+]

技术分享

解题思路:

有符号整数的相减,溢出规则为:

y=a-b

(1)a,b同号时,y一定不会溢出。

(2)若 a>=0 && b<0 ,则当 y<=0 时溢出。

(3)若 a<=0 && b>=0,则当y>=0时溢出。

当a != b时,  a - b 不等于0。

所以a,b异号,y,b同号即可判定为溢出。

首先先定义两个整型变量x,y,计算出他们的位数,然后计算x - y的值,将三个值右移到符号位,比较a,b是否异号,y,b是否同号。

int tsub_ovf(int x, int y)
{
    int w = sizeof(int)<<3;//左移三位相当于乘以2^3,4*8=32位
    int t = x - y;
    x>>=(w-1);//右移31位,只剩符号位
    y>>=(w-1);
    t>>=(w-1);
    return (x != y) && (y == t);
}

  技术分享

解题思路:

计算5*x/8相当于计算((x<<2) + x) >> 3,要舍入x为负数时的情况。

我们假设x的位模式为[b(w-1), b(w-2), ... , b(0)]

计算[b(w-1),b(w-2),b(w-3),   ...    ,b(0),  0, 0] + [b(w-1),b(w-2),...,b(2),  b(1), b(0)] ,然后右移三位,所以我们可以忽略下方的b(1),b(0)。

所以计算(x>>2) + x,再右移一位,但是(x>>2) + x可能也会溢出,所以计算(x>>3) + (x>>1),这样就不会溢出了。看看b(0)+b(2)会不会产生进位,如果产生进位,则再加一。

最后考虑负数的舍入。负数向0舍入的条件是x<0 && ((x<<2)+x 的后三位不全为0)。满足舍入条件的话,结果再加1。加法后三位不全为0等价为x后三位不全为0。

 

int mul5div8(int x)
{
    int b0 = x&1, b2 = (x>>2)&1;
    int ans = (x>>3) + (x>>1);
    int w = sizeof(int)<<3;
    ans += (b0&b2);
    ans += ((x>>(w-1)) && (x&7));
    return ans;
} 

  

技术分享

解题思路:

A.π的二进制数表示为:0 10000000 10010010000111111101011,E=128-127=1,

它表示的二进制小数值为:11.0010010000111111101011

B.根据2.82,可知1/7的表示为0.001001[001]...,

所以22/7为11.001001001001001[001]...

C.从第9位开始不同。

 

深入理解计算机系统第二章家庭作业

原文:http://www.cnblogs.com/bonjourvivi/p/4896316.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!