0 - 0的补码

时间:2017-06-08 16:30:21

标签: c ip checksum integer-arithmetic ones-complement

对于后台,我正在尝试计算存储在常量内存中的IP数据包的校验和(无法对其进行修改)。在做校验和之前,我应该假装数据包中的现有校验和为0.而不是将所有数据复制到临时缓冲区,并存储0,我想对整个数据包进行校验和,然后减去结果中的现有校验和。

要做到这一点,我一直在寻找一个补语的减法版本,我发现here。不幸的是,如果我使用它,并从0减去0,我得到0x1111而不是预期的0:

  1. 将0转换为1的补码:[1111]
  2. 接下来,我们添加0:[1111]
  3. 没有溢出位,所以我们已经完成了......
  4. 我原本预计0 - 0会是0 - 我错过了什么?

2 个答案:

答案 0 :(得分:1)

您无需减去。

如果校验和有效,则计算整个数据包的校验和(包括校验和)应该为0.如果结果不为0,则数据包已损坏。

这是路由器验证校验和的方式。

答案 1 :(得分:0)

我建议在One's Complement

上阅读本教程

https://courses.cs.vt.edu/csonline/NumberSystems/Lessons/SubtractionWithOnesComplement/index.html

我认为这很容易:

0000 - 0000 = 0000 + 1111 = 1111

由于最后一个1111位于One's Complement表单中,我们知道这是一个带有前导1的负数。 最后的操作是一个补充(1111)。

最终答案是- 0000。 如你所知,一个人的补语计算是两个表格 提出零0