CSAPP第三版部分习题解析

时间:2021-01-24 00:12:26

2.89

A.  否,int转float型可能产生精度舍入,而double转float对于精度没有变化

B.  否,x-y操作在int型下可能产生溢出,而在double下不会溢出

C.  否,浮点数加法运算不具有可结合性,例如,(3.14+le10)-le10!=3.14+(le10-le10)

D.  否,浮点数乘法运算不具有可结合性,例如,(le10*le10)*le-10!=le10*(le10*le-10)

E.  否,当浮点数为0时,其自身相除就不为1

 

2.91

A.   11.0010010000111111011011

B.   11.001001…(y=001)

C.   这两个pi的近似值从第九位开始不同

 

3.69

i in %rdi, bp in %rsi

test:

    mov 0x120(%rsi), %ecx                 // %rcx = *(288 + bp)

    add (%rsi), %ecx                          // %rcx = *(288 + bp) + *bp

    lea (%rdi,%rdi,4), %rax                 // %rax = 5 * i

    lea (%rsi,%rax,8), %rax                 // %rax = 5 * i * 8 + bp

    mov 0x8(%rax), %rdx                    // %rdx = *((5 * i * 8 + bp) + 8)

    movslq %ecx, %rcx

    mov %rcx, 0x10(%rax,%rdx,8)     // &(16 + %rax + 8 * %rdx) = %rcx

    retq

前两条指令对应 n = bp->first+bp->last;

第3-5条指令有%rdx = bp + 40*i +8 可以推导出bp->a是从 bp+8 开始的,虽然bp->first是int类型变量,但它在被编译器分配空间时需进行对齐处理,不得不在其后添加4个字节的空闲区域;而40*i(数组下标)表示每一个数组元素占据40个字节;

可以推导 CNT = (288-8)/40 = 7   共分配了7个数组元素单元;

最后一条指令有 &(16 + %rax + 8 * %rdx) = %rcx 可以推导8 + %rax 指向b_struct中第i个a_struct的入口地址,从 (8+%rax)(=%rdx)+8+8*%rdx的表达式推导出 %rdx 表示数组下标,对应ap->idx,又%rdx表示a_struct结构的入口,表明idx变量在a_struct结构中第一个分配地址,即idx是结构体的第一个变量,%rdx+8后指向b_struct中的数组,则idx占据8个字节,又每一个数组元素占8个字节,可推导该数组分配了4个元素空间。

综上,可以推导出

A.   CNT = 7

B.   typedef struct{

     long idx;   

     long x[4];

    }a_struct;