CSAPP:第二章 - 2.1练习题答案
自己做的答案,还没对照过参考答案。有些题太简单,就没做了。
2.1~2.4略
2.5
int val = 0x87654321
|
小端 |
大端 |
存储序列 |
21 43 65 87 |
87 65 43 21 |
show_bytes(valp, 1)/*A.*/ |
21 |
87 |
show_bytes(valp, 2)/*B.*/ |
21 43 |
87 65 |
show_bytes(valp, 3)/*C.*/ |
21 43 65 |
87 65 43 |
2.6 A
3510593 = 0x00359141 = 1101011001000101000001b
3510593.0 = 0x4a564504 = 1001010010101100100010100000100
B
1101011001000101000001b
1001010010101100100010100000100b
2.7
const char* s = "abcdef";
字符串没有大小端的问题,所以内存里面是61 62 63 64 65 66
strlen返回的是长度,不是size所以不包括结束符,那么输出就是61 62 63 64 65 66
2.8 2.9略
2.10
|
*x |
*y |
初始 |
a |
b |
step 1 |
a |
a^b |
step 2 |
a^(a^b) ->b |
a^b |
step 3 |
b |
b^(a ^ b) ->a |
2.11
A: first和last的值相等了,为k
B:对于xor_swap这个函数,x和y是不能够指向同一个地址的. 首先就是个未定义行为.
可以参看 http://c-faq.com/expr/xorswapexpr.html
其次就算不是未定义行为,比如说C语言严格规定了求值得顺序也一样会出现问题,第一步就把x和y变成0了
C:修改为for(first = 0, last = cnt; first < last, first++, last--)就可以了。
2.12
#include <limits.h>
#define MASKA1 0xFF /*assume char size is 8 bits*/
#define MASKA2 UCHAR_MAX /*The value UCHAR_MAX shall equal 2CHAR_BIT - 1.*/
#define MASKB (~MASKA2) /* generate 0xFFFFFF00 in 32bits */
#define MASKC UCHAR_MAX
int main()
{
unsigned int x = 0x87654321;
unsigned int a = x & MASKA2;
unsigned int b = x ^ MASKB;
unsigned int c = x | MASKC;
printf( "%x %x %x\n", a,b,c);
return 0;
}
如果不假设Byte都是8个bit的话,最好使用已经有的C语言macro UCHAR_MAX,以保证移植性
2.13
直接看代码吧
int bis(int x, int m){
return x | m;
}
int bic(int x, int m){
return x & (~m);
}
int bool_or(int x, int y){
return bis(x, y);
}
int bool_xor(int x, int y){
int a = bic(x,y);
int b = bic(y,x);
return bis(a,b);
}
2.14略
2.15
int equal(int x, int y){
return !(x ^ y);
}
2.16略