版权声明:本文基于cainiao_23333的原创文章、参照Charles Petzold 的英文原版及英文原版的官方勘误,修改整理,遵循 CC 4.0 BY-SA 版权协议,转载请附上下面的出处链接和本声明。
本文链接:https://blog.csdn.net/cg1985cg/article/details/107959696
cainiao_23333原文链接:https://blog.csdn.net/weixin_41876385/article/details/99736268
《编码:隐匿在计算机软硬件背后的语言》勘误
版次:2012年10月第1版
印次:2020年4月第25次印刷
P73 第4行 享改为亨
P105 倒数第2行 W上面少一个横线
P167 第12行 非或门改为或非门
P167 第13行 Q反改为Q非
P177 倒数第6行,原英文版Page 171: Just below the center of the page, the sentence "The outputs of the second stage are inputs to the first stage." should read "The outputs of the first stage are inputs to the second stage." Thanks to Jonathan Gold for reporting this error.根据这一点,中文版的这个地方,也应该改为:第一级R-S触发器的输出是第二级的输入。
P178 第1行,与英文原文意思不同,这样翻译更好:这改变了第一级触发器的状态,因为(在第一级里使用的)取反的时钟输入为1。但是第二级触发器状态不变,因为它使用的是未取反的时钟输入0。
英文原文:This changes the first flip-flop stage because the inverted Clock inputs is 1. But the second stage remains unchanged because the uninverted Clock input is 0.
P194 第5行 除数改为被除数(注:事实上,255用16进制表示是FF,所以0-255数字除以16,商作为高位,余数作为低位即可得到2位16进制数字,书上这句话完全可以删去,参看英文原版,作者并没有这句话,应该是翻译作者自己加上的)
英文原文:To calculate those two digits, divide the number by 16 to get the quotient and the remainder. Let's use an earlier example—the decimal number 182.
P198 倒数第5行,之后前面应该加上否则
英文原文:Further changes to the Data input don't affect the outputs until the Clock input goes to 1 again.
P208 最上面的图中,“数据输入”和“写操作端”文字应互换位置,下面的两个RAM中的W和DI也应该互换位置,否则不能独立写入某一个RAM数据。(经 二十四桥明月夜 指出)
P222 倒数第9行,做完了这些工作,算得上万事俱备只欠东风了……其实英文原版中没有这个“万事俱备只欠东风”,译者加上后会让人觉得事情刚准备好还没有开始做,而其实这时只剩下最后一步“让加法器停下来就可以了”,因此这句可以去掉,实在要改可以改为“基本上算是大功告成了”。
英文原文:And after everything is done, we want the automated adder to simply stop so that the contents of the RAM array can be examined.
P231 表的倒数第2行的Subtract的c和t之间多了一个空格
P234 倒数第5行,TANSTAAFL,天下没有免费的午餐,英文原文说是There Ain't No Such Thing As A Free Lunch. 怀疑英文原文也有问题,正确符合语法的表示应该是:There's no such thing as a free lunch。
P240 第1行,应该改为“置位信号时的地址输入”。英文原文:The 16-bit address that's latched from the RAM array is an input to both the 2-to-1 Selector (which allows this address to be an address input to the RAM array) and the 16 bit counter for the Set It function.(经 二十四桥明月夜 指出)
P244 第3行,“这个字节与地址001Eh存储的值相加,所得的值恰巧是Halt指令,但同时它也是一个有效的数字”,这句话应该翻译为:“我们将再拿这个字节与地址001Eh存储的值相加。001Eh里恰好是Halt指令,不过它也是一个有效的数字。”如果用原翻译,会以为加起来的值恰巧是Halt指令,容易让人产生误解。
英文原文:This byte is added to the value at location 001Eh. This happends to be the Halt instruction, but of course it's also a valid number.
P259 倒数第2段最后一句,没有大毛病,为了跟原文意思更接近,也更容易理解,可以加一个字,改为:“虽然继电器计算机被称为电动机械计算机,但真空管才是第一台电子计算机的基础。”
英文原文:While relay machinese were known as electromechanical computers, vacuum tubes were the basis of the first electornic computers.
P261 倒数第2段,讲香农的,“一片题为……”,应该是“一篇题为……”。
P266 第5行,Geoffrey Dummer,应该翻译为:杰弗里,不是杰里佛。
P271 第2行,“只不过此处我用的是异或门”,应改为“只不过那里我用的是或非门”。
英文原文:except that I used NOR gates.
P280 倒数第3行,多了一个逗号
P287 倒数第1行,“以下是8080的逻辑运算指令”就可以了,表中没有算术运算指令(前面已经列过了)。
P290 倒数第9行,所有的“高”和“低”都反了(?)。
英文原文(也有问题?):The lowest bit (shifted out of the bottom) becomes the highest bit (shifted into the top) and also determines the state of the Carry flag.
P295 第1段文字,应为:LXI指令节省了一个字节。而且上表中最后一条LXI指令为栈指针赋了一个特殊的值。通常下面的指令会作为微处理器复位后首先执行的指令之一。
英文原文:The LXI instruction saves a byte. In addition, the last LXI instruction in the preceding table is used to set the Stack Pointer to a particular value. It's not uncommon for this instruction to be one of the first instructions that a microprocessor executes after being restarted.
P295 倒数第4行,DAD指令一般用来计算存储器地址,在标志符中只对进位标志符CF有影响。
英文原文:The DAD instruction is normally used for calculating memory addresses. The only flag that the instruction affects is the Carry Flag.
P311 表中12对应的字符,“身份不明?”就是“Who Are You",下面正文中也是用的英文,如果要翻译,统一翻译成“身份识别码”吧。
P317 第3行,“下面将这33个控制字符……”,翻译版本表已经在上面了,所以应该改为:“上表中将这33个控制字符……”。
P317 倒数第1行,换页符不是12h,是0Ch。英文原文也好像错了。
P348 两段代码有问题。所有的AND指令要改成ANI。NibbleToAscii的ANI指令要放到第一行CPI的前面。这一修改是根据英文原文勘误:Page 322: In the code examples, the CMP instruction should be CPI. The two ADD instructions should be ADI. The AND instruction should be ANI. That ANI instruction should actually be the first instruction of the NibbleToAscii subroutine. Thanks to Erik Larismaa for reporting these errors.
P349 倒数第5行,下画线改为下划线。
P355 最后1行中间0D 0A 33 30 39 31 31 0D 0A(原来第一个31位置错写成3)
P361 第3-4行翻译有问题,改为:QDOS最终更名为86-DOS,并由微软公司授权。
英文原文:QDOS was eventually renamed 86-DOS and licensed by Microsoft Corporation.
P390 倒数第2行,将for语句会一次为a赋值中的一次改为依次
//下面一处错误为cainiao_23333原文中提及,2020年4月第25次印刷版本中没有出现
//P390 第2行JEPG应改为JPEG 注:JPEG是Joint Photographic Experts Group(联合图像专家组)的缩写
P417 第3行MPEG 应为 Moving Picture Experts Group(该组织官方网址 https://mpeg.chiariglione.org/)
参考资料:
英文原版的勘误:https://www.charlespetzold.com/code/
Errata - Hardcover Edition
Page 343: In the formula in the second bulleted item, the exponent of the 2 should be -126 rather than -127:
- (-1)^s × 0.f × 2^(-126)
Thanks to Erik Larismaa for reporting this error.
Ambiguities and Clarifications
Page 6: In the second full paragraph, the last sentence is: "The receiver sees the short blink and the long blink and knows it's an A." Actually, the receiver doesn't know what letter is being sent until the pause that indicates the end of the letter. Thanks to Larry Smith for reporting this flaw.
Page 7: In the first paragraph I state: "SOS isn't an abbreviation for anything -- it's simply an easy-to-remember Morse code sequence." Many people are under the mistaken impression that SOS stands for "Save Our Ship" or "Save Our Souls." However, this meaning appears to be spurious; I can find no evidence that the letters SOS were chosen to stand for anything. For example, the Oxford English Dictionary, 2nd edition, volume XVI, page 34 says of SOS: "The letters s, o, and s, chosen because easily transmitted in Morse code."
Chapter 3: The discussion of Braille was not meant to be exhaustive. In particular, Grade 2 Braille also includes 76 short-form words, such as "imm" for "immediate". These include "ab" for "about" (so it would require only two symbols rather than the 4 shown on page 19) and "Brl" for "Braille," implicitly including a capital. The example of Louis Braille's name in Braille would thus require only 3 symbols for the last name rather than the 8 shown on page 20. Thanks to Ed Godfrey for this information.
Page 26: The first paragraph indicates that the negative terminal of a battery is called an anode and the positive terminal is called the cathode. Some readers have questioned whether this is correct, since it seems opposite from other uses of the words anode and cathode. The terminology used in Code was taken from:
Linden, David, ed. Handbook of Batteries, 2nd edition. New York, NY: McGraw-Hill, Inc., 1995, page 1.3.
The perspective inside the battery corresponds more closely to other uses of the words.
Page 29: The penultimate paragraph contains the statement "the current (I) is 1.5 divided by a large number." The current is not 1.5. The voltage is. The statement might be better written as: "the current (I) equals 1.5 volts divided by a large number." Thanks to Habib Heydarian for reporting this ambiguity.
Page 49: In the last paragraph the statement occurs: "when adding two Roman numerals, you simply combine all the symbols from both numbers and then simplify the result using just a few rules." The passage should have mentioned that this only works well when Roman numerals are written without using the subtraction principle, for example, without using IV to mean 4. The subtraction principle was a comparatively modern enhancement to Roman numeration. Thanks to Larry Smith for reporting this omission.
Page 284: The last paragraph states: "The x86 family continued in 1985 with the 32-bit 386 chip, in 1989 with the 486, and beginning in 1993, with the Intel Pentium line..." Somehow the 186 and 286 were omitted. The sentence should begin: "The x86 family continued in 1982 with the 186 and 286 chips, in 1985 with the 32-bit 386 chip..." Thanks to Luis Alonso Ramos and Larry Smith for reporting these omissions.
Page 343: About a third of the way down the page appears the statement "If e equals 255 and f equals 0, the number is positive or negative infinity, depending on the sign s." This statement implies that infinity is a number, which it is not. The statement might be better phrased "If eequals 255 and f equals 0, the value is positive or negative infinity, depending on the sign s." Thanks to Jonathan Gold for pointing this out.
Page 355: In the last full paragraph, the sentence occurs: "The print statement -- like many ALGOL statements (but not begin or end) -- must be followed by a semicolon." Actually, a semicolon is not required before the end statement, although it doesn't hurt to have one. Thanks to Larry Smith for clarifying this.
Page 382: The first paragraph contains the sentence: "Java programs must be compiled, but the result of the compilation isn't machine code. It's instead Java byte codes." That's the usual case. However, Java source code can be compiled into machine code if a platform-independent binary is not required. Thanks to Larry Smith for clarifying this.