2014-10-06 70 views
5

在未經檢查的上下文中,將值爲2147483647的整數加1,保證結果爲-2147483648?是否定義了C#/ .NET有符號整數溢出行爲?

例如,用下面的代碼

const int first = int.MaxValue; 
    int second = first; 

    if (second >= first) 
    { 
     Console.WriteLine("First check"); 
    } 

    second++; 

    if (second >= first) 
    { 
     Console.WriteLine("Second check"); 
    } 

在C++中,這將是非常有效的兩個「首先檢查」和「第二檢查」要被打印,因爲優化可以重用的結果首先檢查第二個。

與C#一樣嗎?

+0

您是否試過在編號中添加1並在調試器中檢查該編號..當涉及到.NET時,它應該產生'-2147483648' – MethodMan 2014-10-06 21:29:01

+0

,實際上只有一個編譯器 – Steve 2014-10-06 21:30:44

+0

第一個If Condition將命中爲True。 。第二個不會打印到控制檯'Second Check',因爲它變成了一個負整數,正如我在第一條評論中所述的那樣。那麼,你面臨的實際問題是什麼 – MethodMan 2014-10-06 21:31:45

回答

7

從規格:

4.1.5整數類型

checked和unchecked運算符和語句用來控制溢出檢查整型算術運算和轉換(第7.6節。 12)。在已檢查的上下文中,溢出會產生編譯時錯誤或導致引發System.OverflowException。 在未經檢查的上下文中,忽略溢出並丟棄不符合目標類型的任何高位。

這是我可以找到的行爲的唯一描述,但它似乎足夠。所以是的,將一個加到Int32.MaxValue將導致使用二進制補碼錶示的值-1

+2

規範是否也說過必須使用二進制補碼?我在§4.1.5中沒有看到。 – svick 2014-10-07 00:51:56

+3

@svick C#spec(5.0)表示'int'別名爲'System.Int32'。 ECMA-335(CLI)規範(第6版)規定'System.Int32'是與CIL程序集「int32」等效的類庫類型,它被定義爲「32位2的補碼有符號值」。所以,是的,假設一個兼容的C#編譯器和CIL實現,C#ints必須是二進制補碼(類似於'int8','int16'和'int64')。 – Bob 2016-05-25 23:54:46

0

MSDN

對於算術,鑄造,或轉換操作拋出 OverflowException異常,必須發生在checked上下文的操作。通過 默認,在Visual Basic中的算術運算和溢出檢查爲 ;在C#中,他們不是。如果操作發生在未經檢查的 上下文中,則通過丟棄不符合目標類型的任何高位 來截斷結果。

+0

如果您從某個網頁引用,則應該鏈接到它。 – svick 2014-10-07 00:46:59