(CSAPP第三版系列)导航篇传送门


2.56 用不同的示例值运行show_bytes的代码。

#include <stdio.h>typedef unsigned char *byte_pointer;void show_bytes(byte_pointer start, size_t len)
{size_t i;for(i = 0;i < len;i++)printf("%.2x",start[i]);printf("\n");
}void show_int(int x)
{show_bytes((byte_pointer)&x,sizeof(int));
}void show_float(float x)
{show_bytes((byte_pointer)&x,sizeof(float));
}void show_pointer(void *x)
{show_bytes((byte_pointer)&x,sizeof(void *));
}int main()
{int x = 15213;float y = 152.13;void *z = (void *)&x;show_int(x);show_float(y);show_pointer(z);return 0;
}

/*测试结果:

6d3b0000              //show_int(15213);

48211843              //show_float(152.13);

04ff6100               //show_pointer((void *)&x);

*/

2.60 写出该C函数代码unsignedreplace_byte(unsigned x,int I,unsigned char b)。

//由题意及x86-64为小端法机器编写程序#include <stdio.h>typedef unsigned char *byte_pointer;unsigned replace_byte(unsigned x,int i,unsigned char b);int main()
{for(int i = 0;i < sizeof(unsigned);i++)printf("%x\n",replace_byte(0x12345678,i,0xab));return 0;
}unsigned replace_byte(unsigned x,int i,unsigned char b)
{byte_pointer pt = (byte_pointer)&x;  //pt保存x地址*(pt + i) = b;                       //x的i字节替换成字节bunsigned y = *((unsigned *)pt);      //pt指向的unsigned数字return y;
}

/*测试结果:

123456ab              //replace_byte(0x12345678,0,0xab);

1234ab78             //replace_byte(0x12345678,1,0xab);

12ab5678             //replace_byte(0x12345678,2,0xab);

ab345678             //replace_byte(0x12345678,3,0xab);

*/

2.64写出代码实现该函数 int any_odd_one(unsigned x)

#include <stdio.h>int any_odd_one(unsigned x)
{return 0 != (x&0xaaaaaaaa);
}int main()
{printf("%d\n",any_odd_one(0x5)); //二进制表示  00000000 00000000 00000000 00000101printf("%d\n",any_odd_one(0x25));//二进制表示  00000000 00000000 00000000 00100101printf("%d\n",any_odd_one(0x7)); //二进制表示  00000000 00000000 00000000 00001101return 0;
}

/*测试结果

0

1

1

*/

2.68 写出具有如下原型的函数的代码:int lower_one_mask(intn);

#include <stdio.h>
#include <limits.h>int lower_one_mask(int n)
{unsigned x = ((INT_MAX)<<1) + 1u;       //x位模式:1111111111111111...return (int)(x>>((sizeof(int)<<3)-n));  //对x移位实现函数的功能
}int main()
{for(int i = 1;i <= sizeof(int)<<3;i++)printf("%x\n",lower_one_mask(i));return 0;
}

/*测试结果:

1      //lower_one_mask(1)

3      //lower_one_mask(2)

7      //lower_one_mask(3)

f      //lower_one_mask(4)

1f     //lower_one_mask(5)

3f     //lower_one_mask(6)

7f     //lower_one_mask(7)

ff     //lower_one_mask(8)

3fffffff  //lower_one((sizeof(int)<<3)-2);

7fffffff  //lower_one((sizeof(int)<<3)-1);

ffffffff  //lower_one(sizeof(int)<<3);

*/

2.72  voidcopy_int(int val,void *buf,int maxbytes);

A.    解释为什么代码中的条件测试总是成功。

sizeof(val)结果类型为size_t,在maxbytes-sizeof(val)时按无符号数进行运算,

则运算结果仍然为无符号数,所以if条件"maxbytes-sizeof(val)>=0"恒成立。

B.     如何重写这个条件测试,使之工作正确。

void copy_int(int val,void *buf,int maxbytes)
{if(maxbytes >= (int)sizeof(val))memcpy(buf,(void *)&val,sizeof(val));
}

2.76 编写calloc的实现,通过调用malloc执行分配,调用memset将内存设置为0。

#include <stdlib.h>
#include <string.h>void *calloc(size_t nmemb,size_t size)
{if(nmemb == 0 || size == 0)return NULL;else{/*使用cnt作为malloc(),memset()函数的参数,避免由算数溢出引起的漏洞。*/size_t cnt = nmemb * size;pt = (void *)malloc(cnt);if(pt != NULL)memset(pt,0,cnt);return pt;}
}

2.80 写出函数threefourths的代码。

#include <stdio.h>int threefourths(int x)
{/*基本思路:3/4x=1/4x+1/2x。对于舍入误差来说,只与符号位和最低两位有关。据此编写程序。*/int a = x>>((sizeof(int)<<3)-1);int b = x & 1;int c = (x & 3 - b)>>1;int diff = b + c;int mis = !a && !(b==0&&c==0);return (x>>2)+(x>>1)+diff-mis;
}int main()     //测试程序
{printf("i    threefourths(i)    3*4/i\n");for(int i = -8;i <= 8;i++)printf("%2d %12d %12d\n",i,threefourths(i),3*i/4);return 0;
}

/*测试结果:

i   threefourths(i)    3*4/i

-8          -6           -6

-7          -5           -5

-6          -4           -4

-5          -3           -3

-4          -3           -3

-3          -2           -2

-2          -1           -1

-1            0            0

0           0            0

1           0            0

2           1            1

3           2            2

4           3            3

5           3            3

6           4            4

7           5            5

8           6            6

*/

2.84 填写程序的返回值。

int float_le(float x,float y)
{unsigned ux = f2u(x);unsigned uy = f2u(y);/*Get the sign bits*/unsigned sx = ux >> 31;unsigned sy = uy >> 31;/*Give an expression using only ux,uy,sx,and sy*/return ((sx&&sy)&&(ux>=uy))||((!sx&&!sy)&&(ux<=uy))||(sx&&!sy);   //三种可能情况
}


2.88


2.92 实现该函数 float_bits float_negate(float_bitsf);

typedef unsigned float_bitsfloat_bits float_negate(float_bits f)
{unsigned sign = f >> 31;unsigned exp = f >> 23 & 0xff;unsigned frac = f & 0x7fffff;if(exp == 0xff && frac)return f;elsereturn (exp << 23)|frac;
}

2.96 实现该函数 int float_f2i(float_bits f);

int float_f2i(float_bits f)
{unsigned sign = f>>31;unsigned exp = (f>>23) & 0xFF;unsigned frac = f & 0x7FFFFF;if (exp > 158)    //超出表示范围return (int) 0x80000000u;if (exp <= 126)    //非规格化数处理return (int) 0;/*由IEEE 754编码规则,编写程序*/unsigned val = (0x80000000u | (frac << 8))>>(158-exp);/*下面考虑是否超出表示范围*/if (!sign)return val > 0x7FFFFFFF ? 0x80000000u : val;elsereturn val > 0x80000000u ? 0x80000000u : -val;
}

CSAPP第二章家庭作业参考答案相关推荐

  1. CSAPP第7章家庭作业参考答案

    7.6 buf 有 m.o 外部 .data bufp0 有 swap.o 全局 .data bufp1 有 swap.o 局部 .bss incr 有 swap.o 局部 .text count 有 ...

  2. CSAPP第五章家庭作业参考答案

    (CSAPP第三版系列)导航篇传送门 5.14编写5.13的6*1循环展开版本 代码如下: /* Inner product. Accumulate in temporary */ void inne ...

  3. CSAPP第4章家庭作业参考答案

    4.45 不正确 push %rsp的指令会将rsp减8之前的old value压栈 应该是如下代码: movq REG, -8(%rsp) sub $8, %rsp 4.46 不正确 应该改为 ad ...

  4. CSAPP 第二章家庭作业2.70

    /* * fitsBits - return 1 if x can be represented as an * n-bit, two's complement integer.0 otherwise ...

  5. 华理c语言设计网上作业,华东理工大学第一学年第二学期网上作业参考答案C语言设计1...

    华东理工大学第一学年第二学期网上作业参考答案 考生答题情况 作业名称:2012年春季C语言设计(专)课程网上作业1 出 卷 人:SA 题号:1 题型:单选题(请在以下几个选项中选择唯一正确答案) 本题 ...

  6. 20135202闫佳歆-第二章家庭作业-2.69

    第二章家庭作业 选题:2.69 分值:三分 作业过程: 以下是rotate_right函数的代码: unsigned rotate_right(unsigned x, int n) {int endb ...

  7. 《软件工程教程》(第2版) 主编:吴迪 马宏茹 丁万宁 第二章课后习题参考答案

    第2章  软件问题定义及可行性分析 课后习题参考答案 一.填空题 (1)可行性研究的目的是 用最小的代价在尽可能短的时间内确定问题是否能够解决. (2)经济可行性研究范围包括 投资效益分析 .公司经营 ...

  8. [第三章] 深入理解计算机系统第三版 家庭作业参考答案

    人非圣贤孰能无过,欢迎大家提问与纠错 3.58 long decode2(long x, long y, long z) {y -= z;x *= y;return ((y << 63) ...

  9. [第五章] 深入理解计算机系统第三版 家庭作业参考答案

    5.13 A. 画图: 关键路径为第三幅图加粗部分 B. 下界为浮点加法的延迟界限,CPE 为 3.00 C. 整数加法的延迟界限,CPE 为 1.00 D. 关键路径上只有浮点加法 5.14 voi ...

最新文章

  1. 通过 DLPack 构建跨框架深度学习编译器
  2. linux内存源码分析 - 内存压缩(同步关系)
  3. 部署node.js的开发环境
  4. 可拖拽的ImageButton
  5. 一位来自《seo实战密码》读者的来信
  6. rust-let 不可变绑定与可变绑定(4)
  7. Vue 4.0——Vue与Bootstrap整合解决方案
  8. kubernetes(k8s)架构和组件,工作流程 ,资源
  9. 基于CAN总线的家居安防系统设计
  10. CNN图像分割简史:从R-CNN到Mask R-CNN(译)
  11. 亚太地区数学建模优秀论文_2020APMCM 亚太地区大学生数学建模竞赛
  12. 总之就是不太可爱(思维严谨性的考验)
  13. 《Microsoft SQL Server入门教程》第01篇 SQL Server 简介
  14. C++ Qt QComboBox使用教程
  15. element 日期选择图标_TimePicker 时间选择器
  16. c语言:输出一个菱形图案!
  17. 如何用Dreamweaver编辑rails的html.erb文件
  18. 清橙OJ A1095 回溯之教室排课
  19. Python——第四天的Gut Punch
  20. JS - 自由变量与作用域链

热门文章

  1. 基于WEB的网上在线图书商城的设计与实现
  2. Gentoo 教程:目录
  3. 数字化转型的幕后英雄,希捷存储 40 年
  4. 常见的TikTok变现方式,你知道几种?
  5. 【转载】选择性搜索算法介绍——Selective Search
  6. 【数据仓库】现代数据仓库坏了吗?
  7. jQuery toggle 使用
  8. 经济法基础——第六章第三节综合、与增值税联系较为密切的税种
  9. 易宝java面试_java 易宝支付源码 (已测试成功,有测试步骤图片)
  10. 满k叉树编号为 i 的节点的孩子编号公式推导