c#整数溢出默认不检查,仅纯常量表达式在编译时报错(如cs0220),含变量运算需用checked显式启用运行时检查并捕获overflowexception,且checked仅作用于整型算术运算。

默认情况下,C# 的整数运算不会在运行时检查溢出,int.MaxValue + 1 这种操作只会静默绕回成 int.MinValue,而不是报错——这在金融、计费、ID生成等场景里是严重隐患。
什么时候会触发编译错误,什么时候只在运行时才可能出问题
编译器只对**纯常量表达式**做溢出检查。比如 int i = 2147483647 + 10; 直接报 CS0220;但只要里面混了一个变量,比如 int x = 10; int i = 2147483647 + x;,编译就过,运行结果却是 -2147483639。
- 常量溢出 → 编译失败(无法绕过)
- 含变量的溢出 → 默认不检查,静默截断
- 想让含变量的运算也报错,必须显式用
checked
用 checked 表达式或块捕获运行时溢出
checked 是最轻量、最可控的方式,不影响周边代码行为。
- 单个表达式:
int b = checked(a + 1);—— 溢出时抛OverflowException - 代码块:
checked { int a = int.MaxValue; int b = a + 1; // 这里直接抛异常 } - 务必配合
try/catch,否则未处理的OverflowException会让程序崩溃
全局启用 checked(慎用)
项目属性里勾选“检查算术溢出/下溢”,等价于编译时加 /checked+ 开关。此时所有整数运算默认进入 checked 上下文。
- 优点:无需逐处加
checked,适合新项目从头约束 - 缺点:第三方库或性能敏感路径(如图像像素循环)可能因绕回逻辑被破坏而报错
- 补救方式:在局部用
unchecked显式包裹,例如unchecked { return (int)(x * 0.99); }
真正容易被忽略的是:checked 不作用于浮点数、decimal(decimal 本身自带溢出检查)、也不影响位运算和比较操作;它只管整型的 + - * / 和显式转换。别指望它能兜住所有数值异常。











