1、对于srl,注意工作就是将前面的高位清0,即xsra & (1(w-k) - 1)。额外注意k=0时,不能使用1(w-k),于是改用2sra(intk)xsrl =(unsigned)xk;w =sizeof(int) 16);8);4);2);1);x的每个位进行异或,如果为0就说明是偶数个1,如果为1就是奇数个1。那么可以想到折半缩小规模。最后一句也可以是 return (x1)&1根据提示想到利用或运算,将最高位的1或到比它低的每一位上,忽然想如果x就是.该如何让每一位都为1。于是便想到了二进扩展。先是x右移1位再和原x进行或,变成1100000.,再让结果右移2位和原结果或,变成.,最
2、后到16位,变成.。leftmost_one(unsigned x)|=x(x位机器上没有定义移位32次。变为 231。C.定义 a = 115; a=15; set_msb = a beyond_msb = a2;感觉中文版有点问题,注释和函数有点对应不上,于是用英文版的了。个人猜想应该是让x的最低n位变1。lower_one_mask(intn)(2(n-1)rotate_right(unsigned x,sizeof(unsigned)*8;n)(x(w-n-1)这一题是看x的值是否在 - 2(n-1) 到 2(n-1) - 1之间。如果x满足这个条件,则其第n-1位就是符号位。如果该位
3、为0,则前面的w-n位均为0,如果该位为1,则前面的w-n位均为1。所以本质是判断,x的高w-n+1位是否为0或者为-1。fits_bits(int=(n-1);|(x);A.得到的结果是unsigned,而并非扩展为signed的结果。B.使用int,将待抽取字节左移到最高字节,再右移到最低字节即可。xbyte(unsigned word,bytenum)ret = word(3bytenum) 0 & maxbytes = sizeof(val)请先参考题。可知:t = a + b时,如果a,b异号(或者存在0),则肯定不会溢出。如果a,b均大于等于0,则t=0就是负溢出。于是,可以利用三
4、个变量来表示是正溢出,负溢出还是无溢出。saturating_add(inty)sizeof(int)=(w-1);ytpos_ovf =x&y&t;neg_ovf = x&y&t;novf =(pos_ovf|neg_ovf);(pos_ovf & INT_MAX)(novf & ans)(neg_ovf & INT_MIN);对于有符号整数相减,溢出的规则可以总结为:t = a-b;如果a, b 同号,则肯定不会溢出。如果a=0 & b0,则只有当t=0时才算溢出。如果a=0,则只有当t不过,上述t肯定不会等于0,因为当a,b不同号时:1) a!=b,因此a-b不会等于0。2) a-b =
5、 abs(a) + abs(b) = abs(TMax) + abs(TMin)=(2w - 1)所以,a,b异号,t,b同号即可判定为溢出。tsub_ovf(int= y) & (y = t);顺便整理一下汇编中CF,OF的设定规则(个人总结,如有不对之处,欢迎指正)。t = a + b;CF: (unsigned t) (unsigned a) 进位标志OF: (a0 = b0) & (t0 != a0)t = a - b;=0) | (a t0) 退位标志= b (b0 = t(w-1);当然,这里用了乘法,不属于整数位级编码规则,聪明的办法是使用int进行移位,并使用与运算。即 (in
6、t)x(w-1) & y 和 (int)y x。注:不使用long long来实现signed_high_prod(int x, int y)是一件比较复杂的工作,而且我不会只使用整数位级编码规则来实现,因为需要使用循环和条件判断。下面的代码是计算两个整数相乘得到的高位和低位。uadd_ok(unsigned x,y= x;voidsigned_prod_result(inty,h,l)h =0;l =(y&1)x:for(inti=1;ii)&)h+=(unsigned)x(w-i);if(!uadd_ok(l,x(w-1)*y)(y(w-1)*x);最后一步计算之前的h即为unsigned
7、相乘得到的高位。sign_h = unsign_h - (x y) - (y x);sign_h = unsign_h + (x(w-1) * y) + (y(w-1) * x);A. K=5: (x2) + xB. K=9:3) + xC. K=30:5) - (xD. K=-56:3) - (xk,再考虑舍入。舍入的条件是xans(w-1)(1k)-1);ans;这相当于计算(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
8、(w-1),b(w-2),.,b(2), b(1), b(0)最后需要右移3位。因此我们可以忽略下方的b(1),b(0)。于是就计算(x2) + x,再右移一位即是所求答案。不过考虑到(x2) + x可能也会溢出,于是就计算(x3) + (x1),这个显然是不会溢出的。再看看b(0)+b(2)会不会产生进位,如果产生进位,则再加一。最后考虑负数的舍入。负数向0舍入的条件是x (x2)+x 的后三位不全为0)。满足舍入条件的话,结果再加1。容易证明,加法后三位不全为0可以等价为x后三位不全为0。mul5div8(intx)b0 = x&1,b2 =2)&ans =3)(b0&b2);7);不懂题
9、意,感觉就是。A. 1w-n0n:(1n) - 1)B. 0w-n-m1n0m: (1n) - 1) y,而-y依然是Tmin,所以-x -y。B. true,补码的加减乘和顺序无关(如果是右移,则可能不同)。C. false,当x=-1, y=1时,x + y = 0xFFFFFFFE,而(x+y) = 0xFFFFFFFF。D. true,无符号和有符号数的位级表示是相同的。E. true,最后一个bit清0,对于偶数是不变的,对于奇数相当于-1,而TMin是偶数,因此该减法不存在溢出情况。所以左边总是=x。A. 令x为无穷序列表示的值,可以得到x*2k = Y + x。所以 x = Y/
10、(2k - 1)。B. (a)1/7, (b)9/15 = 3/5, (c)7/63 = 1/9浮点数的一个特点就是,如果大于0,则可以按unsigned位表示的大小排序。如果小于0则相反。注意都为0的情况即可。所以条件是:(ux1)=0 & (uy= uy) |(sx & sy & ux =n的情况下才能成立。这时,s=0,e=n+2(k-1)-1,f=11.1。值为2(n+1)-1。C.最小的规格化数为2(1-bias)即2(-2(k-1)+2),所以其倒数值V为2(2(k-1)-2),所以M为,f部分为全0,E=2(k-1)-2,e部分为2(k-1)-2 + bias = 2k - 3,
11、即为11.101。位表示为0-11.101-00.0。描述扩展精度值十进制最小的正非规格化数2(-63)*2(-214+2)最小的正规格化数2(-214+2)最大的规格化数(264-1)*2(214-1-63)+4932HexMEV-00x8000-62-最小的值0x3F01257/256257*2(-8)2560x47008最大的非规格化数0x00FF255/256255*2(-70)-inf0xFF00Hex为0x3AA00x3AA0416/256-5416*2(-13)=13*2(-8)格式A格式B位1 01110 001-9/161 0110 00100 10110 1012080 1
12、110 10101 00111 110-7/10241 0000 01110 00000 1016/2170 0000 00001 11011 000-40961 1111 00000 11000 1007680 1111 0000inf没有特别明白转换成最接近的,然后又说向+inf舍入的含义。按理说,舍入到+inf就是向上舍入,而并不是找到最接近的。表格中是按最接近的进行舍入,并且如果超出范围则认为是inf。如果都按+inf进行舍入,那么第四行格式B将是0 0000 0001。A. false,float只能精确表示最高位1和最低位的1的位数之差小于24的整数。所以当x=TMAX时,用flo
13、at就无法精确表示,但double是可以精确表示所有32位整数的。B. false,当x+y越界时,左边不会越界,而右边会越界。C. true,double可以精确表示所有正负253以内的所有整数。所以三个数相加可以精确表示。D. false,double无法精确表示264以内所有的数,所以该表达式很有可能不会相等。虽然举例子会比较复杂,但可以考虑比较大的值。E. false,0/为NaN,(非0)/为正负inf。同号inf相减为NaN,异号inf相减也为被减数的inf。float的k=8, n=23。 bias = 27 - 1 = 127。最小的正非规格化数为2(1-bias-n) = 2
14、-149。最小的规格化数为2(0-bias)*2 = 2-126。最大的规格化数(二的幂)为2(28-2 - bias) = 2127。因此按各种情况把区间分为TMin, -148 -149, -125 -126, 127 128, TMax。floatfpwr2(intx)/* Result exponent and fraction */unsigned exp,frac;unsigned u;if -149)/* Too small. Return */exp =frac =else-126)/* Denormalized result */131;unsigned exp =(fb23)0xFF;unsigned frac = fb&0x7FFFFF;exp =0xFFfracis_inf(float_bits fb)frac =testFun(float_bits(*fun1)(float_bits),float(*fun2)(float)unsigned x =do小数点右移不会到超过30次(否则就越界了),所以expx
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1