18

我有一个 for 循环,它不断增加一个整数值,直到循环完成。因此,如果限制 n 是一个双精度变量并且增量变量“i”是一个整数,则 i 的增量会超出其限制。

 double total = 0;
 double number = hugetValue;
 for (int i = 1; i <= number; i++)
 {
    total = total + i;
 }
 return total;

如果“i”超出其容量,会发生什么?i 的值如何变化?我会收到运行时错误吗?

4

3 回答 3

13

类似于 C 的某些实现中的行为,其中 anint只是从 INT_MAX 环绕到 INT_MIN(尽管根据 ISO 标准它实际上是未定义的行为),C# 也环绕。在 VS2008 中测试它:

int x = 2147483647;
if (x+1 < x) {
    MessageBox.Show("It wrapped...");
}

将导致出现消息框。

如果您hugetValue的值大于最大值int,那么您的循环将因此而永远运行。

例如,如果它是2147483648,就像你认为你正在接近它一样,从back toint环绕并且循环继续进行。2147483647-2147483648

于 2010-06-24T07:46:43.683 回答
3

抱歉,如果这看起来很粗鲁,但您将通过自己尝试了解更多。

编辑:啊哈,所以你确实尝试过,得到了意想不到的结果。正如其他地方所解释的,类 C 语言倾向于悄悄地包装整数算术。如果检查溢出的成本很高,这实际上是一个非常合理的行为。一旦您知道这可能会发生,请仔细编码,尤其是注意示例中的构造类型。

于 2010-06-24T07:46:03.243 回答
2

如果需要异常,请提供checked编译器选项,或使用checkedC# 中提供的构造。

于 2010-06-24T07:55:57.350 回答