Chr*_*s G 7 c# integer-overflow
为什么在C#中示例一个有效的,可编译的并且只是包装而示例B将无法编译?
一个
int val = 0;
val = val + Int32.MaxValue +2;
Run Code Online (Sandbox Code Playgroud)
要么
int val = Int32.MaxValue;
val++;
Run Code Online (Sandbox Code Playgroud)
乙
int val = 0;
val = 2147483647 + 1;
Run Code Online (Sandbox Code Playgroud)
要么
int val = 0;
int val = Int32.MaxValue + 1;
Run Code Online (Sandbox Code Playgroud)
默认情况下,我知道默认情况下不会检查算术异常,除非您使用配置中的checked方法,块或属性明确地这样做.我的问题更多地涉及编译器然后如何发生算术异常.
Mar*_*off 17
您的B示例在编译时是常量折叠的,向编译器指示它保证溢出.
因为您的A示例使用变量,所以表达式不能(完全)常量折叠,因此编译器无法保证这些值会导致溢出.
例如...
int val = 0;
// some other thread changes `val` to -5...
val = val + Int32.MaxValue +2; // no overflow
Run Code Online (Sandbox Code Playgroud)
但是,如果你知道这val不会改变,并指派0到const int:
const int startval = 0;
int val = startval + Int32.MaxValue + 2;
Run Code Online (Sandbox Code Playgroud)
您可以获得编译时溢出检查,因为该值可以完全确定,因此可以进行常量折叠.