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: firstlast的值相等了,为k

B:对于xor_swap这个函数,xy是不能够指向同一个地址的. 首先就是个未定义行为.

可以参看 http://c-faq.com/expr/xorswapexpr.html 

其次就算不是未定义行为,比如说C语言严格规定了求值得顺序也一样会出现问题,第一步就把xy变成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都是8bit的话,最好使用已经有的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

   

你可能感兴趣的:(APP)