加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#中的算术异常

发布时间:2020-12-15 18:31:30 所属栏目:百科 来源:网络整理
导读:为什么在C#中示例一个有效的,可编译的并且只是包装而示例B将无法编译? 一个 int val = 0;val = val + Int32.MaxValue +2; 要么 int val = Int32.MaxValue;val++; 乙 int val = 0;val = 2147483647 + 1; 要么 int val = 0;int val = Int32.MaxValue + 1; 默
为什么在C#中示例一个有效的,可编译的并且只是包装而示例B将无法编译?

一个

int val = 0;
val = val + Int32.MaxValue +2;

要么

int val = Int32.MaxValue;
val++;

int val = 0;
val = 2147483647 + 1;

要么

int val = 0;
int val = Int32.MaxValue + 1;

默认情况下,我知道默认情况下不会检查算术异常,除非您使用配置中的checked方法,块或属性明确地这样做.我的问题更多地涉及编译器然后如何发生算术异常.

解决方法

您的B示例在编译时为 constant-folded,向编译器指示它保证溢出.

因为您的A示例使用变量,所以表达式不能(完全)常量折叠,因此编译器无法保证这些值会导致溢出.

例如…

int val = 0;
// some other thread changes `val` to -5...
val = val + Int32.MaxValue +2; // no overflow

但是,如果您知道val不会更改,并将0分配给const int:

const int startval = 0;
int val = startval + Int32.MaxValue + 2;

您可以获得编译时溢出检查,因为该值可以完全确定,因此可以进行常量折叠.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读