//注释部分为中间步骤
/*******2.69***********/}
/*************2.71**************/
A. 按照该扩展方法必定为无符号数,有符号数就会出错
B.
int xbyte(packed_t word , int bytenum)
{
return (word << ((3 - bytenum) << 3)) >> 24;
}
/*************2.72*************/
A. maxbytes会隐式的转换为size_t,而两个无符号数之差必然大于等于0
B. if(maxbytes >= sizeof(val))
/*************2.73****************/
/*************2.73**************/
/*Addition that saturates to TMin or TMax*/
//判断是否溢出参照练习题2.30
int saturating_add(int x,int y)
{
int sum = x + y;
int w = sizeof(int) << 3;
int max_bit = 1 << (w - 1);
int x_max = x & max_bit;
int y_max = y & max_bit;
int sum_max = sum & max_bit;
int neg_over = x_max && y_max && (!sum_max);
int pos_over = (!x_max) && (!y_max) && sum_max;
neg_over && (sum = (1 << w - 1));
pos_over && (sum = (1 << w - 1) - 1);
return sum;
}
/*************2.74**************/
/*************2.74**************/
/*Determine whether subtracting arguments will cause overflow*/
int tsub_ovf(int x , int y)
{
int sum = x - y;
int w = sizeof(int) << 3;
int max_bit = 1 << (w - 1);
int x_max = x & max_bit;
int y_max = y & max_bit;
int sum_max = sum & max_bit;
int pos_over = (!x_max) && y_max && sum_max;
int neg_over = x_max && (!y_max) && (!sum_max);
return pos_over || neg_over;
}
/*************2.75**************/
unsigned unsigned_high_prod(unsigned x,unsigned y)
{
int w = sizeof(unsigned) << 3;
unsigned x_lmb = x >> (w - 1);
unsigned y_lmb = y >> (w - 1);
int temp = signed_high_prod((int)x , (int)y);
return (unsigned)(temp + x_lmb * y + y_lmb * x);
}
/************2.76***************/
A. (x << 2) + x
B. (x << 3) + x
C. (x << 5) - (x << 2)
D. (x << 3) - (x << 6)
/************2.77***************/
/************2.77***************/
/*Divide by power of two. Assume 0 <= k <= w-1 */
int divide_power2(int x, int k)
{
int w = sizeof(int) << 3;
int x_lmb = x >> (w - 1);
x_lmb && (x = x + (1 << k) - 1);
return x >> k;
}
/************2.78***************/
int mul5div8(int x)
{
x = (x << 2) + x;
int w = sizeof(int) << 3;
int x_lmb = x >> (w - 1);
x_lmb && (x = x + (1 << 3) - 1);
return x >> 3;
}
/*************2.79******************/
int fiveeighths(int x)
{
int w = sizeof(int) << 3;
int x_lmb = x >> (w - 1);
x_lmb && (x = x + 7);
x = x >> 3;
return x + (x << 2);
}
/****************2.80*******************/
A. ~((1 << n) - 1)
B. ~(~0 << n) << m
/******************2.81********************/
A. 当y取INT_MIN的时候不成立
B. 无论溢出与否,移位操作总成立
C. 当x与y都取全1的时候不成立
D. 在位级操作上这个等式总是成立的
E. 最后一位的权值总是正的,故等式一定成立
/******************2.82*********************/
A. Y / (2^k - 1)
B. k = 3 Y = 1 1/7
k = 4 Y = 9 9/15
k = 6 Y = 7 7/63