![](/img/trans.png)
[英]Why isn't ThreadAbortException automatically rethrown if raised after an asynchronous await?
[英]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不再是a和b 的和,其中a和b的類型為int
。 有時是,但有時是a , b和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
計算(我們期望發生溢出且對此沒有問題)和我們知道不會發生溢出的計算以及在沒有發生這種情況的計算中,將其顯式關閉想要(非常輕微的)溢出檢查的性能損失。
如果未指定,.NET在對數字數據類型int
等進行操作時將不檢查數字溢出。
您可以通過以下方式啟用此功能:以檢查模式構建(將/checked
傳遞到編譯器參數中),或在代碼段中使用checked
:
checked
{
int i = int.MaxValue + int.MaxValue;
Console.WriteLine(i);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.