最近在翻译RFC文档的时候遇到这样一个句子,是关于校验和的:
The Checksum is the 16-bit one's complement of the one's complement sum of the whole IGMP message (the entire IP payload).
本来对校验和还是挺亲切的,可是,反复看几遍one's complement of one's complement sum。。。顿时脑子里满是浆糊。。。one's complement到底是什么东西?1的补码?上网一搜,终于找到一个例句:《Computer Network》(Andrew S. Tanenbaum )在中国的翻译版《计算机网络》(清华大学出版社)对于校验和是这样翻译的:
(原文)The checksum algorithm is simply to add up all the 16-bit words in one's complement and then to take the one's complement of the sum.
(译文)校验和的算法是简单地将所有16位字以补码形式相加,然后再对相加和取补。
仔细一看,终于感觉茅塞顿开。其实两句的意思是一致的,只是《Computer Network》讲的稍微详细一点而已,作者在这里直接将one's complement翻译成“补码”。继续google,发现还有two's complement, 1's complement, 2's complement等,原来补码在英文文档里有1的补码和2的补码两种,1的补码是指正数=原码、负数=反码,而2的补码是指正数=原码,负数=反码+1(忽略溢出)。翻译的时候很多人会直接将它们译成“补码”,所以导致中文里1的补码和2的补码说法不常见。
为了避免混淆和保持英文愿意,将上文的句子翻译如下:校验和是IGMP报文(整个IP负载)16比特长度补码和的补码(这里补码类型为1的补码)。