家庭作业
第二章
2.62
分析:判断x移位之后是否还是全为1
bool int_shifts_are_logical()
{
int x = ~0x00;
x >>= 1;
return ~x;
}
2.71
A. packed_t是无符号数,而它包装的4个字节都是有符号数,1byte的包装在无符号数中的有符号数扩展后符号位并没有扩展。例如,1byte的0xFF表示-1,而扩展成32位后应该为0xFFFFFFFF。而按照原函数中所示,扩展后结果是0x000000FF
B.
int xbyte(packed_t word , int bytenum)
{
return (word << ((3 - bytenum) << 3)) >> 24;
}
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) 【注意此时0<n<w】
B. ~(~0 << n) << m
2.83
浮点数最高位为符号位。
先处理-0、+0比较的情况:
!(ux<<1)&&!(uy<<1)
x为正,y为正:
(!sx && !sy && (ux >= uy))
x为负,y为负:
(sx && sy && (ux <= uy))
x为正,y为负:
!sx&&sy
以上式子使用||连接起来就是最终答案:
(!sx && sy) || (sx && sy && (ux <= uy)) || (!sx && !sy && (ux >= uy))
2.84
A. E = 2; M = 5/4; f = 1/4; V = 5.0
B. n位小数全为1。 E = n; M = 2 - 1/(2^n); f = 1 - 1/(2^n); V = 2^n * ( 2 - 1/(2^n) ) = 2^(n + 1) - 1
C. 最小规格化数: E = 2 - 2^(k - 1); M = f = 2^(-n); V = 2^E * M; 倒数为1/V
2.86
Hex | M | E | V |
0x8000 | 0 | -62 | - |
0x3f01 | 257/256 | 0 | 257*2^(-8) |
0x4700 | 1 | 8 | - |
0x00ff | 255/256 | -62 | 255*2^(-70) |
0xff00 | - | - | - |
0x3aa0 | 416/256 | -5 | 416*2^(-13) |
2.87
1 01110 001 | -9/16 | 1 0110 0010 | -9/16 |
0 10110 101 | 208 | 0 1110 1010 | 208 |
1 00111 110 | -7/1024 | 1 0000 0111 | -7/1024 |
0 00000 101 |
6/2^17 |
0 0000 0000 | 0 |
1 11011 000 | -2^12 | 1 1111 0000 | 负无穷 |
0 11000 100 | 768 | 0 1111 0000 | 正无穷 |