溢出异常被抛出-即使值超过了限制。

3
为什么以下代码的输出结果是-2,而不是抛出overflow exception异常?
 long x = long.MaxValue;
 long y = long.MaxValue + x;

1
如果你想在所有情况下强制应用程序抛出溢出异常,请前往项目“属性->构建->高级构建设置”,并勾选“检查算术溢出/下溢”。 - Hamed
2个回答

4

实际行为取决于项目设置,unchecked等等。要确保溢出异常,请使用checked,例如。

 checked {
   long x = long.MaxValue;
   long y = long.MaxValue + x;
 }

4
因为您正在执行一个未经检查的上下文,所以可能会出现这种情况。原始整数类型的算术运算可以在checked or unchecked context中执行。在已检查的上下文中,溢出的操作会抛出异常,在未经检查的上下文中,它们仅使用底部N位(取决于类型)。默认取决于项目设置,但“默认默认”是未经检查的。
您可以在已检查的上下文中显式执行操作,也可以更改项目设置。
(仅针对算术)显式执行操作的方法如下:
long x = long.MaxValue;
long y = checked(long.MaxValue + x);

请注意,常量表达式在编译时进行检查,如果发生溢出且未被明确取消检查(无论项目设置如何),将导致编译时错误。例如:
long x = long.MaxValue + 1; // Error
long y = unchecked(long.MaxValue + 1); // Equivalent to y = long.MinValue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接