深入理解计算机系统勘误
深入理解计算机系统习题答案

1
2
10 11 12 13 14
CHAPTER 1. SOLUTIONS TO HOMEWORK PROBLEMS
void show_double(double x) { show_bytes((byte_pointer) &x, sizeof(double)); } code/data/show-ans.c
Homework Problems. These are found at the end of each chapter. They vary in complexity from simple drills to multi-week labs and are designed for instructors to give as assignments or to use as recitation examples.
Problem 2.40 Solution: This exercise should be a straightforward variation on the existing code.
code/data/show-ans.c
1 2 3 4 5 6 7 8 9
void show_short(short int x) { show_bytes((byte_pointer) &x, sizeof(short int)); } void show_long(long int x) { show_bytes((byte_pointer) &x, sizeof(long)); }
code/data/show-ans.c
1 2 3 4 5 6 7 8
int is_little_endian(void) { /* MSB = 0, LSB = 1 */ int x = 1; /* Return MSB when big-endian, LSB when little-endian */ return (int) (* (char *) &x); } code/data/show-ans.c
软件测试工程师年终工作总结

软件测试工程师年终工作总结时光荏苒,如今2022年的帷幕已经谢下,2022年的钟声已经敲响,在公司高层的正确领导下,我们__科技又走过了一年。
而我也在自己的努力以及同事的帮助下完成了2022年我所负责的工作,以下就是我对过去这一年的工作总结:一、测试工作及经验作为软件部测试组的一员,首先要做好的就是自己的本职工作,我在2022年中所做的工作主要有:测试用例的编写,对系统的测试、跟踪;需求、高保图、界面和功能的测试;功能测试用例的编写,高保图、系统的测试;__的静态页面测试和功能测试;__的功能测试;第一、二、三迭代高保图测试,测试用例编写,静态页面和功能测试,并主持参与测试用例评审;平台高保图的测试和系统静态页面、功能的测试;__的高保图测试和测试用例的编写;__的静态页面和功能测试,参与测试用例的评审;__的高保图测试、静态页面和功能测试;用户使用手册的编写。
一年的工作,让我获得很多方面的经验:1.编写逻辑覆盖率全的测试用例甚为重要。
在理解需求的前提下编写测试用例,使得我掌握了多种测试用例编写方法,更让我对产品的需求有更加深入的理解,须知对需求是否理解透彻决定了能否有效、全面地对产品进行测试。
2.要站在用户角度对系统进行测试。
从一些项目中出现的未能及时发现的bug中,我认识到用户体验的重要性,现在能够越来越多的从这方面来执行测试。
3.对拿到手的项目有较清晰的思路,能够更加快速、准确地发现问题。
4.越来越规范的工作流程的让我们的工作有条不紊的进行,让我深刻认识到工作的规范性是多么的重要,并且从中学习如何从文档和流程上规范工作。
5.同事间的沟通很重要。
现在不管遇到什么不确定或疑惑,都与开发人员、产品经理等及时沟通,大大提高了工作的效率。
二、加强自我能力的提高只有不断的提高自己各种的能力,才能胜任越来越艰巨的任务,因此在工作相对不饱和的时候,我自己进行了一些学习。
为提高对“用户体验”的理解,我学习了《下一站用户体验》,书中一些经验确实让我获益匪浅。
关于位操作的书 -回复

关于位操作的书-回复
以下是一些关于位操作的书籍:
1. 《深入理解计算机系统》(Computer Systems: A Programmer's Perspective)- 由Randal E. Bryant和David R. O'Hallaron撰写。
该书全面介绍了计算机系统的各个方面,包括位操作。
2. 《Hacker’s Delight》- 由Henry S. Warren Jr.撰写。
这本书专注于位操作的技巧和优化,涵盖了各种位操作的基本概念和高级技巧。
3. 《Bitwise Operations in C: Tips, Tricks, and Techniques》- 由Alan M. Perlis撰写。
这本书专门介绍了使用C语言进行位操作的技巧、窍门
和技术。
4. 《竞赛中的位运算》- 由范明、周源、成蕾等撰写。
这本书主要面向程序设计竞赛选手,通过大量的例题和实例详细讲解位操作在算法设计中的应用。
这些书籍均可帮助读者深入理解位操作的概念、技巧和应用场景。
根据个人的学习目标和背景,选择适合自己的一本作为入门指南或进阶参考材料。
《深入理解计算机系统》第三版第三章家庭作业答案

《深⼊理解计算机系统》第三版第三章家庭作业答案简述相信⼤部分⼈在做这些题的时候,因为书中没有给答案,⽽去⽹上找参考答案,⽐如那些⾼阅读量的博客和git 。
当然,我也是这样,但他们的答案中还是有好多错误,⽐如3.59他们⼏乎都没讲清楚提⽰中的公式怎么来的,3.60中对移位操作中对%cl 的读取,等等。
希望读者们在阅读这些⽂章时,要带着⾃⼰的思想和疑问去理解,⽽不是⼀味地觉得答案就肯定是对的,当然,本⽂有任何错误,也欢迎各位指出。
3.58long decode2(long x,long y,long z){y = y - z;x = x * y;y <<= 63;y >>= 63;return y ^ x;}y 先左移63位,再右移63位,如果之前y 是奇数,那么y 的⼆进制全是1;y 是偶数,那么y 的⼆进制全是0.3.59⾸先讲解⼀下,提⽰⾥的公式x =264∗x h +x l x =264∗xh +xl ,之所以可以这么写是因为符号拓展,以4位⼆进制int 为例:1111的补码数,为-1.将其进⾏符号拓展后为1111 1111,其值也为-1,但这⾥可以将1111 1111写为⾼位1111的补码数 * 2424 + 低位1111的⽆符号数:即-1 * 2424 + 15 = -1.原理:%rdx 和%rax 的⼆进制连起来表⽰这个数,既然连起来了,符号位就跑到了%rdx 的最⾼位了,除符号位权值为负外,其余位的权值均为正。
所以,⾼位寄存器%rdx 当做补码数,低位寄存器%rax 当做⽆符号数。
因为符号位现在在⾼位寄存器那⼉呢,所以⾼位寄存器当做补码数了;⽽低位寄存器的每⼀位的权值现在都是正的了,所以低位寄存器要当做⽆符号数。
所以x l xl 为T 2U (x )T2U(x)即x 的⼆进制表⽰作为⽆符号数。
x l xl 与x x 有相同的位级表⽰。
x h xh ,当原数符号位为1,64位⼆进制位上全为1,其值为-1;当原数符号位为0时,64位⼆进制位上全为0,其值为0。
计算机错误处理与容错技术解析

计算机错误处理与容错技术解析计算机是现代社会中不可或缺的工具,然而在计算机工作的过程中,由于硬件故障、软件错误或其他原因,会不可避免地出现错误。
因此,计算机错误处理与容错技术成为了计算机科学领域中的一个重要研究方向。
本文将详细解析计算机错误处理与容错技术,涵盖以下几个方面的内容:1. 错误类型与产生原因- 硬件错误:例如芯片故障、电路连接错误等。
- 软件错误:例如编程错误、逻辑错误等。
- 网络错误:例如数据传输中的丢包、延迟等。
2. 错误诊断与定位- 硬件错误诊断:通过硬件测试设备、故障排除等手段来检测和定位硬件错误。
- 软件错误诊断:通过调试工具、错误日志等手段来检测和定位软件错误。
- 网络错误诊断:通过网络分析工具、数据包分析等手段来检测和定位网络错误。
3. 容错技术- 硬件容错技术:例如冗余冗余阵列(RAID)、错误检测与纠正码(ECC)等。
- 软件容错技术:例如备份与恢复、事务处理等。
- 网络容错技术:例如冗余路由、链路聚合等。
4. 错误处理与修复- 硬件错误处理:例如更换故障硬件、替换故障部件等。
- 软件错误处理:例如修复软件漏洞、修改代码等。
- 网络错误处理:例如调整网络拓扑、增加网络带宽等。
5. 错误预测与预防- 硬件错误预测与预防:通过硬件监控、负载平衡等手段预测和预防硬件错误。
- 软件错误预测与预防:通过代码审查、测试用例设计等手段预测和预防软件错误。
- 网络错误预测与预防:通过流量分析、拓扑优化等手段预测和预防网络错误。
6. 错误处理与容错技术的应用领域- 数据中心:例如在大规模服务器集群中,故障容错成为了提升系统可靠性的重要手段。
- 嵌入式系统:例如在飞行控制系统、医疗设备等领域,容错技术能够保证系统的稳定运行。
- 云计算:例如在云平台中,通过容错技术可以提供高可用、高性能的服务。
总结:计算机错误处理与容错技术是保障计算机系统运行稳定性和可靠性的重要手段。
通过对不同类型的错误进行诊断、容错和预测,可以极大程度上降低错误对计算机系统的影响,提高系统的可用性和性能。
深入理解计算机系统

出版社:中国电力出版社原出版社:Pearson Education系列名:国外经典计算机科学教材系列作者:(美)Randal E. Bryant/ Davic O'Hallaron/译者:龚奕利/ 雷迎春/出版日期:2004年5月版别版次:2004年5月北京第一版第一次印刷国标编号:ISBN 7-5083-2175-8条形码:9787508321752字数:1209千字内容提要:本书英文版久负盛名,被众多专业人士称为“最伟大的计算机教材”之一,着名的美国卡内基梅隆大学计算机科学系一直将本书作为教材使用,程序员眼中的透彻讲述计算机系统的扛鼎之作。
作者Randal E. Bryant是卡耐基梅隆大学的计算机科学系主任,ACM和IEEE 双院士(Fellow),其研究成果多次获得ACM和IEEE颁发的大奖。
本书共分十三章,分别介绍了信息的表示和处理、程序的机器级表示、处理器体系结构、存储器层次结构、静态和动态链接、虚拟存储器、系统级I/O、网络编程和并发编程等精彩内容。
其目的是解释计算机系统的所有本质概念,并向读者展示这些概念是如何实际地影响应用程序的正确性、性能和实用性。
与其他主要针对系统构造人员的系统类书籍不同,这本书是写给程序员的,是从程序员的角度来描述的。
本书为软件和硬件之间搭起了一个桥梁,它给出了一种帮助读者分别从硬件和软件的角度去理解一个程序及其行为的途径,这也填补了国内计算机系统教学中的一个空白。
本书的最大优点是帮助读者理解概念,让读者很清楚地在脑海中构造一个层次型的计算机系统,从最低层数据在内存中的表示(如我们一直陌生的浮点数表示),到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库,到最后的用户应用。
本书提供了大量的例子和练习及部分答案。
尤其值得一提的是,对于每一个基本概念都有相应的笔头或程序试验,加深读者的理解。
作者介绍:Randal E. Bryant 1973年获得密歇根大学(University of Michigan)学士学位,随即就读麻省理工学院(Massachusetts Institute of Technology)的研究生院,并在1981年获计算机博士学位。
《深入理解计算机系统》读后感

《深入理解计算机系统》读后感第一次听到这本书还是我们的导师袁志斌老师介绍的。
在这之前我是对它毫无概念可言。
袁老师对这本书可谓是推崇备至,因此就介绍给我们全班,并希望说让我们能够静下心好好的去看它、了解它。
于是我开始了阅读"深入"的征程。
之所以说是"征程"是因为这本说的内容确实是很难。
至少是对于我来说。
很多东西之前都没有接触过。
除了那点少的可怜的C语言底子之外就剩下数字电路的东西了。
其他的基本上是听都没听过。
毕竟这本书要求先修的课程有很多,神马《计算机组成原理》,《汇编程序设计》。
这些都没有学过。
但是,就算是这样,凭着被袁老师鼓起的热情,硬着头皮买了它,开始了啃"深入"的日子。
在这里先简单的介绍一下"深入"的基本章节内容。
第一章A Tour of Computer System对计算机系统总体的做了一个简单的介绍,第二章Representing and Manipulating Information主要说的是信息在计算机中的表示形式。
包括整数和浮点数的表示形式。
第三章Machine-Level Representation of Program汇编语言的复习。
过程调用,尤其是过程调用(包括递归调用)中堆栈的使用情况是经常会考到的。
数据在内存中的"对齐"方式,也是经常出现在考题中的。
比如定义一个结构体数组,打印出其中一个元素的地址,问这个地址相对数组起始地址有多少个字节的距离。
第四章Processor Architecture计算机体系结构的内容。
处理器结构,各种逻辑门、功能单元,指令集,指令的执行,指令执行的流水线等。
第五章Optimizing Program Performance如何优化程序的执行效率,包括代码的优化,编译器的优化,及CPU级别的优化。
CPU级别的优化,微指令的概念,功能单元上微指令的并行,程序分支的预测等。
深入理解计算机系统(第三版)第二章家庭作业答案

深⼊理解计算机系统(第三版)第⼆章家庭作业答案博客⾥只有代码部分,位运算和浮点表⽰真妙!2.55#include <stdio.h>#include <string.h>typedef unsigned char* byte_pointer;void show_byte(byte_pointer x,int len){for(int i =0; i < len; i++)printf("%.2x ", x[i]);printf("\n");}void show_int(){int num =8;byte_pointer bp =(byte_pointer)#show_byte(bp,sizeof(int));}void show_double(){double num =3.1415926535;byte_pointer bp =(byte_pointer)#show_byte(bp,sizeof(double));}void show_short(){short num =8;byte_pointer bp =(byte_pointer)#show_byte(bp,sizeof(short));}int main(){show_int();show_double();show_short();return0;}2.58#include <iostream>using namespace std;typedef unsigned char* byte_point;int is_little_endian(){int32_t num =1;byte_point bp =(byte_point)# printf("%s\n", bp);cout <<*bp << endl;printf("%d\n", num);if(*bp)return1;elsereturn0;}int main(){printf("%d\n",is_little_endian());}2.59typedef unsigned char* byte_point;void show_byte(int x,int len){byte_point bp =(byte_point)&x;for(int i =0; i < len; i++)printf("%.2x ", bp[i]);printf("\n");}byte_point change(int x,int y){byte_point bx =byte_point(&x);byte_point by =byte_point(&y);byte_point bz =(byte_point)malloc(sizeof(int));for(int i =0; i <sizeof(int); i++){if(i ==0)*bz =*bx;else*(bz + i)=*(by + i);}return bz;}int main(){int x =0x89abcdef;int y =0x76543210;printf("%d %d\n", x, y);byte_point z =change(x, y);show_byte(x,sizeof(int));show_byte(y,sizeof(int));for(int i =0; i <sizeof(int); i++)printf("%.2x ", z[i]);// show_byte(z, sizeof(int));return0;}2.60#include <stdio.h>unsigned replace_byte(unsigned x,int i,unsigned char b){ int move = i <<3;return(x &~(0xFF<< move)| b << move);}int main(){int x =0x12345678;printf("0x%.8X\n",replace_byte(x,2,0xAB));printf("0x%.8X\n",replace_byte(x,0,0xAB));return0;}2.61int main(){int move =(sizeof(int)-1)<<3;//全为1输出1,否则输出0int x =0x0;int y =0xffffffff;printf("%d %d\n",!(x ^~0x0),!(y ^~0x0));printf("%d %d\n",!(~x),!(~y));//全为0输出1printf("%d %d\n",!(x ^0),!(y ^0));printf("%d %d\n",!x,!y);//最低有效字节全为1输出1printf("%d %d\n",!(~(x &0xff)<< move),!(~(y &0xff)<< move)); //最⾼有效字节全为0输出1printf("%d %d\n",!(x >> move),!(y >> move));printf("%d\n", y >> move);return0;}2.62#include <stdio.h>bool int_shifts_are_arithmetic(){int x =0x80000000;return(x >>30)&8;}int main(){printf("%d",int_shifts_are_arithmetic());return0;}2.63signed srl(unsigned x,int k){unsigned xsra =(int)x >> k;int obj =~(((1<< k)-1)<<((sizeof(int)<<3)- k)); return xsra & obj;}signed sra(int x,int k){int xsrl =(unsigned) x >> k;int sum =sizeof(int)<<3;int judge =1<<(sum -1- k);judge &= xsrl;int obj =~(judge -1);return xsrl | obj;}int main(){printf("%.8x\n",srl(0x81001100,4));printf("%.8x\n",sra(0x81001100,4));return0;}2.64#include <stdio.h>int any_odd_one(unsigned x){unsigned obj =0x55555555;return!!(x & obj);}int main(){unsigned x =0x00000001;printf("%d\n",any_odd_one(x));return0;}2.65#include <iostream>int odd_ones(unsigned x){int w =sizeof(int)<<3;x ^= x >>16;x ^= x >>8;x ^= x >>4;x ^= x >>2;x ^= x >>1;return x &1;}int main(){int a =0xffff0000;int b =0x00000103;printf("%d %d",odd_ones(a),odd_ones(b)); return0;}2.66int leftmost_one(int x){int w =sizeof(int)<<3;x |= x >>1;x |= x >>2;x |= x >>4;x |= x >>8;x |= x >>16;return x &((~x)>>1|0x80000000);}int main(){int a =0xff000000;int b =0x00000040;printf("%.8x %.8x\n",leftmost_one(a),leftmost_one(b)); return0;}2.67#include <stdio.h>int bad_int_size_is_32(){int set_msb =1<<31;int beyond_msb = set_msb <<1;return set_msb &&!beyond_msb;}int bad_int_size_is_32_in16(){int set_msb =1<<15;set_msb <<=15;set_msb <<=1;int beyond_msb = set_msb <<1;return set_msb &&!beyond_msb;}int main(){printf("%d\n",bad_int_size_is_32());printf("%d\n",bad_int_size_is_32_in16());return0;}2.68#include <stdio.h>int lower_one_mask(int x){int w =sizeof(int)<<3;return(unsigned)-1>>(w - x);}int main(){int a =6;int b =17;printf("%.8x\n",lower_one_mask(a));printf("%.8x\n",lower_one_mask(b));return0;}2.69unsigned rotate_left(unsigned x,int n){ int w =sizeof(int)<<3;unsigned ans = x;ans <<= n;ans |= x >>(w - n);return ans;}int main(){int a =0x12345678;int x1 =0;int x2 =20;printf("0x%.8x\n",rotate_left(a, x1)); printf("0x%.8x\n",rotate_left(a, x2)); return0;}2.70#include <stdio.h>#include <limits.h>int fits_bits(int x,int n){int w =sizeof(int)<<3;int obj = x <<(w - n)>>(w - n); return obj == x;}int main(){int x =0x00000011;int n =1;printf("%d\n",fits_bits(x, n));printf("%d\n",fits_bits(INT_MAX,32)); printf("%d\n",fits_bits(0,0));return0;}2.71#include <stdio.h>typedef unsigned packed_t;int xbyte(packed_t word,int bytenum){ int w = bytenum +1<<3;return(int)word <<(32- w)>>(3<<3); }int main(){int word =0xf1f2f380;printf("%.8x\n",xbyte(word,0));printf("%.8x\n",xbyte(word,1));printf("%.8x\n",xbyte(word,2));printf("%.8x\n",xbyte(word,3)); return0;}2.72void copy_int(int val;void*buf,int maxbytes){if(maxbytes <0)return;if(maxbytes >=sizeof(val))memcpy(buf,(void*)&val,sizeof(val));}2.73#include <stdio.h>#include <limits.h>int saturating_add(int x,int y){int w =sizeof(int)<<3;int is_diff_sign =(x ^ y)>>(w -1);int is_overflow =((x + y)^ x)>>(w -1);int judge = x >>(w -1);// printf("%d %d %d\n", is_diff_sign, is_overflow, judge);// printf("%d\n", is_diff_sign & (x + y));int a =(is_diff_sign &(x + y));int b =((~is_diff_sign &((~is_overflow &(x + y))+(is_overflow &(judge & INT_MIN +~judge & INT_MAX)))));int c=((is_diff_sign &(x + y))+(~is_diff_sign &((~is_overflow &(x + y))+(is_overflow &((judge & INT_MIN)+(~judge & INT_MAX)))))); //printf("%d %d %d\n", a, b, c);return c;}int main(){printf("%d\n",saturating_add(1,100));printf("%d\n",saturating_add(1000,-10));printf("%d\n",saturating_add(INT_MAX,12321));printf("%d\n",saturating_add(INT_MIN,-1));return0;}2.74#include <stdio.h>#include <limits.h>int tsub_ok(int x,int y){y =-y;int w =sizeof(int)<<3;int same =(x ^ y)>>(w -1);int overflow =((x + y)^ x)>>(w -1);return same ||!overflow;}int main(){printf("%d\n",tsub_ok(INT_MIN,1));printf("%d\n",tsub_ok(-1,100));printf("%d\n",tsub_ok(-23,INT_MAX));return0;}2.75#include <inttypes.h>int signed_high_prod(int x,int y){int64_t high_prod =(int64_t)x * y;return high_prod >>32;}unsigned unsigned_high_prod(unsigned x,unsigned y){int w =sizeof(int)<<3;int bit_x = x >>(w -1);int bit_y = y >>(w -1);int sig_high =signed_high_prod(x, y);return sig_high + x * bit_y + y * bit_x;}unsigned unsigned_high_prod_two(unsigned x,unsigned y){ uint64_t high_prod =(uint64_t)x * y;return high_prod >>32;}int main(){unsigned x =0xffffffff;unsigned y =0x12345678;printf("%.8x\n",unsigned_high_prod(x, y));printf("%.8x\n",unsigned_high_prod_two(x, y));return0;}2.76#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>void*calloc(size_t nmemb, size_t size){if(!nmemb ||!size)return NULL;// return (int*)malloc(sizeof(int) * size);size_t size_sum = nmemb * size;if(nmemb == size_sum / size){void*ptr =malloc(size_sum);memset(ptr,0, size_sum);return ptr;}elsereturn NULL;}int main(){void*p =calloc(123,1);if(p ==NULL){printf("P = NULL\n");}elsefree(p);return0;}2.77int mul1(int x){return(x <<4)+ x;}int mul2(int x){return x -(x <<3);}int mul3(int x){return(x <<6)-(x <<2);}int mul4(int x){return(x <<4)-(x <<7);}int main(){int x =10;printf("%d\n",mul1(x));//*17printf("%d\n",mul2(x));//*-7printf("%d\n",mul3(x));//*60printf("%d\n",mul4(x));//*-112return0;}2.78#include <stdio.h>#include <limits.h>int divide_power2(int x,int k){int w =sizeof(int)<<3;int sign = x >>(w -1);int bias =(1<< k)-1;return(~sign &(x >> k))+(sign &(x + bias)>> k); }int main(){printf("%d\n",divide_power2(51,1));printf("%d\n",divide_power2(-51,1));return0;}2.79#include <stdio.h>#include <limits.h>int mul3div4(int x){int w =sizeof(int)<<3;x =(x <<1)+ x;int sign = x >>(w -1);int bias =(1<<2)-1;return(~sign &(x >>2))+(sign &((x + bias)>>2)); }int main(){printf("%d\n",mul3div4(3));printf("%d\n",mul3div4(4));return0;}2.80#include <stdio.h>#include <limits.h>int threefourths(int x){int w =sizeof(int)<<3;int sign = x >>(w -1);int bias =(1<<2)-1;x =(~sign &(x >>2))+(sign &(x + bias)>>2);return(x <<1)+ x;}int main(){printf("%d\n",threefourths(4));printf("%d\n",threefourths(5));printf("%d\n",threefourths(-5));return0;}2.81#include <stdio.h>int A(int k){return(-1)<< k;}int B(int k,int j){return~A(k)<< j;}int main(){printf("%.8x\n",A(4));printf("%.8x\n",B(8,4));return0;}2.82#include <stdio.h>#include <stdlib.h>/*A错。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Compute -f
Compute|f|
中文版勘误
darrenhp
2011.02.28
P92 练习题2.12
A. x & ?0xFF
A. x &0xFF
中文版勘误
李志杰
2011.08.18
P99 练习题2.44答案F.
补码和无符号乘法有相同的位级行为
补码和无符号加法有相同的位级行为
操作应该先改变大小
英文版勘误
David Ramsey
2011.04.11
P119 练习题3.6
leal 0xA(,%eax,4),%edx
leal 0xA(,%ecx,4),%edx
中文版勘误
赵亮
2011.07.27
P119 3.5.2第一段第三行
减一运算法
减一运算符
中文版勘误
Ji Bin
2011.02.28
v = true-expr;
goto done;
false:
v = else-expr;
done:
v =then-expr;
goto done;
false:
v = else-expr;
done:
英文版勘误
Lei Ma
2010.09.27
P150 图3-22 b)
箭头指向0x080483e1上方
箭头应该指向0x080483e1处
变量q还可以是unsigned long类型的,因此一共有八种合法的函数原型。另外四种是:
void incrprob_s_ul(int x, unsigned long *q, int *t);
void incrprob_u_ul(unsigned x, unsigned long *q, int*t);
Hale Waihona Puke 中文版勘误gnu_emacser
2011.07.24
P113 图3-3 最后一行,第一列
寄存器
存储器
中文版勘误
Ji Bin
2011.07.27
P117 “给C语言初学者”下第一段第二行
指令1和2从存储器当中
指令1从存储器当中
英文版勘误
Ji Bin
2010.04.11
P118 第二行
操作应该先改变符号
Arow[j]被初始化为&A[i][0]
Arow被初始化为&A[i][0]
中文版勘误
Ji Bin
2011.02.28
P171 第11行
例如,3、6、7节中
例如,3.6.7节中
中文版勘误
王泰格
2011.12.6
P173 第12行
操作符用于指针的间接引用
运算符*用于指针的间接引用
中文版勘误
Anders Cui
P120 3.5.3节,第一句话
第二项给出的是要移位的位数
第二项给出的是要移位的数值
中文版勘误
王泰格
2011.03.28
P123 第5行
除数
被除数
英文版勘误
吴旭东
2011.01.07
P124 图3-10上倒数第三行
除了他们只设置条件码而改变目的寄存器的值
除了他们只设置条件码而不改变目的寄存器的值
中文版勘误
有八种不同的函数声明都会得到同样的代码:返回值类型可以是int或者unsigned,参数p可以是int *或者unsigned *,以及参数x可以是int或者unsigned。这些选择是相互独立的。
英文版勘误
Qiangqiang Luo
2011.08.28
P222 练习题3.33答案B
将栈指针加了40
深入理解计算机系统,第二版
Computer Systems: A Programmer's Perspective, Second Edition (CS:APP2e)
发现日期
页码行号
原文
修改后
指出人
2011.10.13
P15 1.线程级并发,第二行
时间共享
分时(time-sharing)
中文版勘误
unsignedreplace_byte(unsigned x, unsigned char b, int i);
中文版勘误
Darren
2011.05.24
P81 家庭作业2.60
将“强制类型转换,无论是现实的还是隐式的。”从“禁止使用”类别移至“允许的运算”类别
英文版勘误
Yu Tanaka
2011.05.24
英文版勘误
David O’Hallaron
2010.11.30
P154 倒数第三段
这些参数的位置也从相对于%esp的旧值+4和0的位置移到了相对于%ebp的新值+12和+8的位置。
这些参数的位置也从相对于%esp的旧值+4和0的位置变成了相对于%ebp的新值+12和+8的位置。
中文版勘误
黎规好
2011.02.28
王泰格
2010.11.01
P178 练习题3.43 第四行
寄存器%edi等于0x2,寄存器%esi等于0x3。
寄存器%edi等于0x3,寄存器%esi等于0x2
英文版勘误
Mustafa Kazdagli
2011.08.21
P180 第三段第三行
operatioin
operation
中文版勘误
Ji Bin
P202 参考文献说明,第二段
Applicatioin
Application
中文版勘误
花明月暗
2012.07.05
P215 练习题3.12答案
num_t也有可能是long long类型的。对此,C语言标准指明乘法会先把x转换成long long类型,所以这个乘法是基于有符号运算的。不过有趣的是,结果的位级表示是和无符号的情况一样的。要看到这个,注意B部分中当把64位有符号数y分成32位值y_h和y_l时,我们应该把y_h看做一个有符号数,而把y_l看做无符号的。因此对于x*y_l这个64位乘积应该用无符号乘,而x*y_h的低32位对无符号和有符号运算来说,都是一样的。
P46 公式2-8
x<2w-1
u<2w-1
中文版勘误
华章出版社
2011.01.07
P47 第二行
65563+-12345=53191
65536+-12345=53191
中文版勘误
华章出版社
2011.03.02
P56 练习题2.27下面
丹麦数学家Niels Henrik Abel
挪威数学家Niels Henrik Abel
2012.04.03
P173 中间代码
(int) (*fp)(int, int *);
int(*fp)(int, int *);
英文版勘误
Ronald Greenberg
2011.02.28
P177 第一张表格下第四行
但是调用者也不能依靠这个寄存器的完整性
但是调用者也不能依赖这个寄存器的正确性
中文版勘误
P68 2.4.1节第二段第一行
小数点左边的数字的权是10的正幂
小数点左边的数字的权是10的非负幂
英文版勘误
Dong Han
2011.08.03
P68 2.4.1节第三段第一行
b-n-1
b-n+1
英文版勘误
Dong Han
2011.08.03
P68 公式2-19下面一行
点左边的位的权是2的正幂
点左边的位的权是2的非负幂
英文版勘误
Qiangqiang Luo
2011.10.19
P217 练习题3.19答案
我们可以看到,实际上计算13!的时候,就已经溢出了,因为1,932,053,504 / 13 = 148,619,500.31。
英文版勘误
Richard Callahan
2012.07.31
P221 练习题3.32答案
即使处理器完全一样,但是运行不同的操作系统,也会有不同的编码规则
中文版勘误
张岩
2011.06.05
P33 DATA:BOOL中 第4行
a & (b . c)
a & (b|c)
中文版勘误
Darren
2011.11.18
P33 DATA:BOOL中 第5行
(a . b) & (a . c)
(a|b)& (a|c)
英文版勘误
Dag Henning Liodden Sørbø
2011.07.13
P57 公式2-13上一行
y ≤ 2w-1
y<2w-1
中文版勘误
Ji Bin
2011.01.07
P57 公式2-13下一行
xw-12w+x
xw-12w+x
中文版勘误
华章出版社
2011.02.01
P57 图2-23标题中
当它大于2w-1+1时,产生正溢出
华章出版社
2011.07.28
P127 倒数第二段倒数第二行
参加图3-11
参见图3-11
中文版勘误
Ji Bin
2011.08.01
P134 练习题3.20 C中
参考图3-14b
参考图3-14c
英文版勘误
Ji Bin
2010.11.18
P142 对于传统的IA32,编译器产生的代码具有以下抽象代码所示的形式
中文版勘误
刘宗浩
2011.04.24