簡體   English   中英

為什么不引發溢出異常?

[英]Why isn't an overflow exception raised?

以下代碼運行正常,沒有錯誤, diff為1:

int max = int.MaxValue;
int min = int.MinValue;
//Console.WriteLine("Min is {0} and max is {1}", min, max);
int diff = min - max;
Console.WriteLine(diff);

難道不是所有程序都值得懷疑嗎? a + b不再是ab 和,其中ab的類型為int 有時是,但有時是ab和2 * int.MinValue的和*。

*總和與普通英語含義相加,忽略任何計算機知識或字長

在PowerShell中,它看起來更好,但仍然不是add操作的硬件例外。 似乎要用很long才能轉換回int

[int]$x = [int]::minvalue - [int]::maxvalue
Cannot convert value "-4294967295" to type "System.Int32". Error: "Value was either too large or too small for an Int32."

默認情況下,C#中的溢出檢查處於關閉狀態。 價值觀簡單地以通用方式“環繞”。

如果使用/checked編譯了相同的代碼,或者使用了checked { ... }塊,則將引發異常。

根據您正在執行的操作,您可能需要檢查或明確想要它。 例如,在Noda Time中 ,默認情況下我們已啟用了溢出檢查,但是對於GetHashCode計算(我們期望發生溢出且對此沒有問題)和我們知道不會發生溢出的計算以及在沒有發生這種情況的計算中,將其顯式關閉想要(非常輕微的)溢出檢查的性能損失。

有關更多詳細信息,請參見C#參考中的checkedunchecked頁面,或C#語言規范的7.6.12部分。

如果未指定,.NET在對數字數據類型int等進行操作時將不檢查數字溢出。

您可以通過以下方式啟用此功能:以檢查模式構建(將/checked傳遞到編譯器參數中),或在代碼段中使用checked

checked
{
    int i = int.MaxValue + int.MaxValue;
    Console.WriteLine(i);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM