首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 整數溢位處理:checked/unchecked 關鍵字、編譯器選項與最佳實踐

     編輯:關於C#

溢位問題本質

定長整數型別 (byte, short, int, long 等) 有固定值域。運算結果超出範圍即發生溢位。


byte b = 255;
b = b + 1; // 理論 256,實際 0 (回繞)

兩種控制層級

checked / unchecked 關鍵字用法

區塊形式


checked {
    int a = int.MaxValue;
    int b = a + 1; // 拋出 OverflowException
}

unchecked {
    int c = int.MaxValue + 1; // 截斷回繞,c = -2147483648
}

運算式形式


int x = checked(int.MaxValue + 1); // 拋出
int y = unchecked(int.MaxValue + 1); // 截斷

受影響運算

  • 一元運算子:++, --, - (負號) —— 僅當運算元為整數
  • 二元運算子:+, -, *, / —— 兩運算元皆為整數
  • 顯式數值轉換:(byte)largeInt, (int)largeLong

不受影響:浮點數運算、decimal (自帶溢位檢查)、邏輯運算、位移運算。

常數運算式 vs 非常數運算式

層級方式範圍優先順序
專案層級編譯器選項 /checked+ 或 /checked-整個組件最低 (預設值)
區塊/運算式層級checked / unchecked 關鍵字指定區塊或單一運算式最高 (覆蓋專案設定)

const int MAX = int.MaxValue;
// 常數運算式
int c1 = MAX + 1;           // CS0220: 編譯錯誤 (常數溢位)
int c2 = checked(MAX + 1);  // CS0220: 編譯錯誤
int c3 = unchecked(MAX + 1); // 通過,c3 = -2147483648

// 非常數運算式
int v = GetValue(); // 執行期才知值
int r1 = v + 1;       // 預設 unchecked:截斷
int r2 = checked(v + 1); // 執行期可能拋出

階乘範例:溢位檢測實戰


long Factorial(int n)
{
    long result = 1;
    for (int i = 2; i <= n; i++)
    {
        checked { result *= i; } // 單步檢測
    }
    return result;
}

// 呼叫
try { Console.WriteLine(Factorial(25)); } // 25! > long.MaxValue → OverflowException
catch (OverflowException) { Console.WriteLine("溢位!"); }

方法呼叫邊界:checked 不跨越方法


int Multiply(int x, int y) => x * y; // 此處無 checked

// 呼叫端加 checked 無效!
int r = checked(Multiply(1000000, 1000000)); // 不會拋出,Multiply 內部 unchecked
// 正確做法:在 Multiply 方法內部加 checked,或回傳 checked 運算式

最佳實踐建議

類型預設行為checked 內文unchecked 內文
常數運算式 (編譯期可計算)編譯錯誤 (溢位視為錯誤)編譯錯誤允許,截斷結果
非常數運算式 (執行期計算)依專案設定 (預設 unchecked)執行期拋出 OverflowException截斷,不拋出

總結

C# 提供靈活的溢位控制:專案預設 unchecked (效能優先),區塊/運算式 checked (安全優先)。關鍵認知:checked 不跨越方法邊界、常數運算式編譯期檢測、decimal 內建檢查。根據領域需求在效能與正確性間取捨。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景建議
金融/科學計算、索引計算區塊 checked 保護關鍵運算
位元操作、雜湊、加密、隨機數unchecked 明確語意:預期回繞
庫開發者文件化溢位行為,不強制專案 /checked+
效能敏感熱路徑避免 checked (微小開銷),改用手動檢查 if (a > MAX - b)
常數運算式善用編譯期檢測捕捉 Bug