防止二重补充造成的不良行为

时间:2013-07-22 13:05:01

标签: integer-arithmetic

我阅读了以下问题:Value of i for (i == -i && i != 0) to return true in Java并且稍微留下了眼花缭乱。

由于使用了错误的单位系统,人们会读到spacecraft being lost,所以看到问题和awnser中提到的行为对我来说是非常意外的。

如何在没有运行时惩罚的情况下防止由此产生的错误/意外行为? (我发现用=比较很难想到有意义的代码,而我认为abs返回负值失败是相当简单的。是否有例外捕获? Linters警告这个?


意外行为:

如果输入是最小负数,则

java abs()返回最小负数。 -x = x有一个0以外的解,是二进制补码中的最小负数。

1 个答案:

答案 0 :(得分:3)

最佳做法是

  1. 在系统中使用合理类型。请注意,机器int不是数学整数。如果您的程序可能需要使用机器int范围之外的数字,那么您应该使用大整数库,而不是机器整数。

  2. 防守计划。如果操作可能导致值超出范围,那么您应该在执行操作后显式检查(或者,更好的是,在操作之前检查以查看参数是否会导致误差)。

  3. 当然,如果你这样做2.你仍然必须决定在发生错误的情况下该做什么,而你没有这样做。但是,在大多数语言中使用大整数会导致性能下降。运行时惩罚是否大于或小于执行安全检查的惩罚可能取决于编程语言和程序的细节。

    最后,程序员的工作是对他们编写的代码负责。该语言只能为您提供如此多的帮助。