首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们在计算校验和时使用1的补码而不是2的补码

为什么我们在计算校验和时使用1的补码而不是2的补码
EN

Stack Overflow用户
提问于 2021-03-23 18:54:34
回答 1查看 51关注 0票数 1

在计算UDP校验和时,我知道我们会对结果进行补充,并使用它来检查错误。但是我不明白为什么我们使用1的补码而不是2的补码(as shown here)。如果没有错误,1的补码结果为-1 (0xFFFF),2的补码结果为0 (0x0000)。

为了检查正确的传输,接收器的CPU必须首先否定结果,然后查看ALU的零标志。这将花费1个额外的周期来进行否定。如果使用了2的补码,则只需查看0标志即可完成错误检查。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-09 23:48:46

这是因为如果发送方和接收方机器的字节顺序不同,使用2的补码可能会给出错误的结果。

如果我们使用下面的例子:

0000 1111 1110 0000 1111 0000 0001 0000

在小端机器上计算的带有2补码的校验和为:

0000 0000 0001 0000

如果我们将原始数据添加到big-endian机器上的校验和中,我们将得到:

0000 0000 1111 1111

这将表明我们的校验和是错误的,尽管它不是。然而,1的恭维结果与机器的字节顺序无关,所以如果我们对1的补码数做同样的事情,我们的校验和将是:

0000 0000 0000 1111

当与数据相加时,我们会得到:

1111 1111 1111

这允许短UDP校验和工作,而不需要发送方和接收方机器具有相同的字符顺序。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66761735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档