4

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

有人读到航天器因使用错误的单位系统而丢失,所以看到问题和 awnser 中提到的行为对我来说是非常意外的。

如何防止由此产生的错误/意外行为而不会造成运行时损失?(我发现通过比较很难想到有意义的代码=,而我认为abs返回负值失败相当简单)。有例外要捕获吗?警告这一点的短绒?


意外行为:

如果输入是最小负数, javaabs()返回最小负数。-x=x 有一个非 0 的解,即二进制补码中的最小负数。

4

1 回答 1

3

最佳做法是

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

  2. 防御性地编程。如果操作可能导致值超出范围,那么您应该在执行操作后显式检查这一点(或者,更好的是,在操作之前检查参数是否会导致错误)。

当然,如果您执行 2. 您仍然必须决定在发生错误时该怎么做,而 1 则不会。但是,在大多数语言中使用大整数会导致性能损失。运行时惩罚是大于还是小于执行安全检查的惩罚可能取决于编程语言和程序的细节。

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

于 2013-07-22T13:14:02.407 回答