为什么将两个结果大于 int.MaxValue 的大整数相加不会引发溢出异常?
如果我们在程序中使用以下循环,则循环在 C# 4.0 中永远不会结束。
for (int i = 1; i <= int.MaxValue; i++)
{
}
这是因为 int.MaxValue (2147483647) 加 1 不会导致溢出异常,但会导致 -2147483648(考虑到 32 位 int 和2 的赞美)。
int i = int.MaxValue;
Console.WriteLine(i + 1);
最近行为似乎发生了变化。 查看问题算术运算导致 OverflowException .这种变化背后的原因可能是什么?
If we are using the following loop in a program, the loop never ends in C# 4.0
for (int i = 1; i <= int.MaxValue; i++)
{
}
This is because adding 1 to int.MaxValue (2147483647) will not result in an overflow exception, but results in -2147483648 (taking into consideration 32bit int and 2's compliment).
int i = int.MaxValue;
Console.WriteLine(i + 1);
It seems the behavior changed recently. See the question Arithmetic operation caused OverflowException .What could be the reason behind this change?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
整数(和其他整数类型)的溢出异常仅在
checked< 中完成/code>
上下文。
因此,这将导致异常:
默认情况下它们不会设置为执行此操作,因为它们比简单的溢出更昂贵。
来自 MSDN:
和:
这不是最近的变化 - C# 从第一天起就是这样。您在问题中看到的是 VB.NET 代码,默认情况下位于已检查的上下文中。
因此,保持默认值,VB.NET 中的溢出代码将引发异常,但 C# 中的相同代码不会引发异常。
Overflow exceptions for integer (and other integral types) are only done in
checked
contexts.So, this will cause an exception:
They are not set to do this by default as they are more expensive than simply overflowing.
From MSDN:
And:
This is not a recent change - C# has been like this from day one. What you see in the question is VB.NET code, which is by default in a checked context.
So, keeping to defaults, overflowing code in VB.NET will throw an exception, but identical code in C# will not.