C# 整数溢出异常
我在此处遇到编译器错误的原因:C# 整数溢出异常,c#,.net,integer-overflow,C#,.net,Integer Overflow,我在此处遇到编译器错误的原因: int a = 2147483647 + 10; 而不是在这里,如果我正在执行相同的操作: int ten = 10; int b = 2147483647 + ten; 我正在学习选中的的用法,MSDN网站不清楚为什么在第一个代码段中出现OverflowException: 默认情况下,仅包含常量值的表达式会导致 如果表达式生成的值超出 目标类型的范围。如果表达式包含一个或多个 非常量值,编译器不会检测到溢出 它只是解释了行为,而不是行为的原因。我想知道引擎
int a = 2147483647 + 10;
而不是在这里,如果我正在执行相同的操作:
int ten = 10;
int b = 2147483647 + ten;
我正在学习选中的的用法,MSDN网站不清楚为什么在第一个代码段中出现OverflowException:
默认情况下,仅包含常量值的表达式会导致
如果表达式生成的值超出
目标类型的范围。如果表达式包含一个或多个
非常量值,编译器不会检测到溢出
它只是解释了行为,而不是行为的原因。我想知道引擎盖下发生了什么。原因是当你有
int a=2147483647+10代码>编译器可以预测语句(a
)的结果,它会知道它会导致溢出,因为2147483647和10都是常量,它们的值在编译时是已知的
但是当你有
int ten = 10;
int b = 2147483647 + ten;
在执行int b=2147483647+ten之前,其他一些线程(或其他一些线程,可能是向导,可能是内存中的危险…)可能已经更改了ten
的值代码>语句,在编译时无法预测溢出。以30秒的优势获胜。。。你跑得很快+1那么,编译器在计算这两个数字时会抱怨,但在计算数字和变量“十”时不会抱怨。您必须使用checked来识别该案例中的溢出。这有点不连贯,不是吗?如果您想要相同的行为(在运行时),只需选中项目设置中的复选框,使其默认为“选中”,而不是“未选中”,或者将代码包装在选中的块checked{int ten=10;int b=2147483647+ten;}
,这也会在运行时引发相同的错误。您无法在编译时获取该行为。它不会强制执行相同的行为,编译器不会为检查版本的int b=2147483647+ten给出编译错误代码>任意一个@ScottChamberlain@ScottChamberlain我明白了,高级设置:“检查算术溢出/underfow”t您得到的是编译器错误,而不是第一种情况下的异常。