溢出异常抛出-即使值超过限制
Overflow exception is throwing- even the value exceeds the limit
为什么下面的代码给出输出 -2
而不是抛出 overflow exception
?
long x = long.MaxValue;
long y = long.MaxValue + x;
实际行为取决于项目设置,unchecked
等。为了确保溢出异常使用checked
,例如
checked {
long x = long.MaxValue;
long y = long.MaxValue + x;
}
大概是因为您在 未检查 上下文中执行它。原始整数类型的运算可以在 checked or unchecked context 中执行。溢出的操作在已检查的上下文中抛出异常,而在未检查的上下文中仅使用底部的 N 位(取决于类型)。默认值取决于项目设置,但未选中 "default default"。
您可以显式在选中的上下文中执行操作,或者更改项目设置。
明确地做(只是为了算术):
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
为什么下面的代码给出输出 -2
而不是抛出 overflow exception
?
long x = long.MaxValue;
long y = long.MaxValue + x;
实际行为取决于项目设置,unchecked
等。为了确保溢出异常使用checked
,例如
checked {
long x = long.MaxValue;
long y = long.MaxValue + x;
}
大概是因为您在 未检查 上下文中执行它。原始整数类型的运算可以在 checked or unchecked context 中执行。溢出的操作在已检查的上下文中抛出异常,而在未检查的上下文中仅使用底部的 N 位(取决于类型)。默认值取决于项目设置,但未选中 "default default"。
您可以显式在选中的上下文中执行操作,或者更改项目设置。
明确地做(只是为了算术):
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