【发布时间】:2016-01-13 10:16:23
【问题描述】:
Wikipedia article for Fletcher's checksum 声明:
这些示例假设二进制补码算法,因为弗莱彻算法在一个补码机器上是不正确的。
This SO question 提供一本书的扫描,上面写着:
以 255 为模执行加法(1 的补码算术)
Fletcher 的校验和使用运行和,所以我认为不需要负数,目的是识别差异,所以只要使用相同的数字系统(一个补码,二进制补码,两者都不是)那么检查系统有关系吗?维基百科页面上给出的示例也指定了无符号整数类型。
我已将其标记为 C,因为 Wikipedia 页面上给出的示例均使用 C 语言,因此这可能与此有关。我不是数学家,也不是一个称职的程序员,所以很可能有一些非常明显的原因说明补码会产生影响。
收到的任何见解都表示感谢。
【问题讨论】:
-
我可以添加吗,我花了 3 个不同的浏览器,关闭每个插件、扩展程序、防火墙,等待一段时间,使用隐私浏览,等待更多......大约 50 次尝试只是 绕过那个该死的烦人的验证码。显然,在 10000 次代表之后它不会打扰我,所以请,通过投票按钮给我一些爱! (o_O)
-
只有在现代二进制补码硬件或无符号计算中,您必须手动考虑从 254 到 0(模 255)的包装。一个补码系统上的有符号字节将免费包装,避免 -0 或 +0,无需人工干预。
-
哦,假设您正在计算一个简单的算术 8 位校验和。如果直接在二进制补码(模 256)中完成,则任何单个位错误只会影响它们上方的更高有效位,而在一个补码和(模 255)中雪崩到较低位,因为模数相对于该位职位。也就是说,否则第 7 位中的两个错误会相互抵消,而第 0 位中的错误需要 256 个错误才能抵消。
-
@doynax 谢谢,知道这很有帮助。我认为您应该添加这些作为答案。
标签: c checksum twos-complement ones-complement