2010-06-24 71 views
11

我有一個for循環,不斷遞增整數值直到循環完成。所以,如果極限n是一個雙變量,而增量變量'i'是一個整數,我會增加超出其極限。遞增整數值超出其整數限制 - C#

double total = 0; 
double number = hugetValue; 
for (int i = 1; i <= number; i++) 
{ 
    total = total + i; 
} 
return total; 

'i'如果超過其容量,會發生什麼情況?我的價值如何變化?我會得到一個運行時錯誤?

感謝

NLV

+1

哪種語言? – sharptooth 2010-06-24 07:44:44

+0

編輯標題。 – NLV 2010-06-24 07:51:10

+1

我在問題中添加了C#標記。對於有些人來說(至少對我而言)更有幫助。 SO允許您根據標籤過濾/輸出,並且您可以根據標籤獲取問題列表。大多數情況下,我只查看我感興趣的特定標籤,而且每隔一段時間,我都會收到最近問題的列表,無論標籤如何。 – 2010-06-24 08:01:22

回答

8

類似於C的一些實現中的行爲,其中int只是從INT_MAX環繞到INT_MIN(儘管它根據ISO標準實際上是未定義的行爲),C#也包裝了。在VS2008中測試它:

int x = 2147483647; 
if (x+1 < x) { 
    MessageBox.Show("It wrapped..."); 
} 

將導致消息框取消。

如果您的hugetValue大於最大值int,那麼您的循環會因此而永遠運行。

例如,如果它是2147483648,就像你覺得你越來越接近它時,int迴繞從2147483647回到-2147483648和循環只是不斷去。

+0

我在C#中編寫的。對不起,沒有提到。我明白你的答案。 – NLV 2010-06-24 07:49:13

+0

@NLV:一些適用於C#。 – leppie 2010-06-24 07:52:57

+0

@NLV:我編輯了問題以包含C#標記。請注意,在許多問題中,語言很重要(有些允許轉換含糊不清,有些不允許在編譯時使用)。在提出問題時,您提供的更多信息(以合理的條款)越好。 – 2010-06-24 07:53:26

3

道歉,如果這是不禮貌的,但你會學到更通過這種嘗試自己。

編輯:aha,所以你嘗試過,並得到意想不到的結果。正如別處已經解釋的那樣,類C語言傾向於悄悄地包裝整數算術。如果檢查溢出的成本很高,那實際上就是一個相當合理的行爲。一旦你知道可能會發生這樣的情況,請仔細編碼,特別是在你的例子中觀察這種構造。

+0

在正確的意義上採取了它。我實際上嘗試過,並陷入無限循環。當我調試它時,我發現我的價值是負面的。我想知道爲什麼它拋出一個錯誤,而是繼續循環。有什麼理由呢? – NLV 2010-06-24 07:48:08

+0

這裏有兩個不同的問題,爲什麼轉換產生一個負數,爲什麼編譯器不會抱怨這個值是負數。最新更簡單:您可以修改循環內部的循環變量並使其成爲負數。檢測這是否發生對於編譯器來說太複雜了,所以它只是假定你知道你想要什麼(或者當你陷入無限循環時你會發現很快就足夠了) – 2010-06-24 07:58:21

2

如果您想要例外,請提供checked編譯器選項或使用C#中提供的checked構造。

+0

只是引用了一個來源:http://msdn.microsoft.com/en-us/library/a569z7k8.aspx基本上所有的操作都是未經檢查的,除非你在兩邊都使用常量 - 在編譯時檢查。 – 2014-03-04 20:51:29