溢出exception正在抛出 – 即使该值超出限制
为什么以下代码将输出设为-2
而不是抛出overflow exception
?
long x = long.MaxValue; long y = long.MaxValue + x;
实际行为取决于项目设置, unchecked
等。要确保溢出exception使用已checked
,例如
checked { long x = long.MaxValue; long y = long.MaxValue + x; }
大概是因为你在未经检查的环境中执行它。 原始整数类型的算术可以在已检查或未检查的上下文中执行。 溢出的操作在已检查的上下文中抛出exception,并在未经检查的上下文中使用底部的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