解题思路:
有符号整数的相减,溢出规则为:
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