2017-02-10 54 views
0

我在上面的程序做了如下程序如果輸入的數字超過C中數據類型的範圍,會發生什麼情況?

#include <stdio.h> 

int main() 
{ 
    // Testing Number 

    unsigned int num; 

    printf("Enter The Number : "); 
    scanf("%u" , &num);     // If I Enter 4294967298 
    printf("Your Number is : %u" , num); // Output Comes Out To Be 2 
} 

現在,如果進入4294967298輸出出來是2,這裏的計算器,answers是說,如果你輸入大於所要求的範圍更數則scanf將存儲UINT_MAX,並將打印該答案,並受到該答案的啓發,並進行討論,這是錯誤的。我嘗試了我自己,它不是像這樣的行爲,而是在模範算術之後打印範圍之後。

如果有人能指出標準對此的看法,那將會非常有幫助。

我已閱讀其他answer,這兩個問題的答案都是衝突的,沒有人給出正確答案,所選答案在主題上有所不同。

是否依賴於實現?

許多人在這個問題上似乎有所不同,如果你能夠參照標準支持你的觀點,那麼將會非常感激。

如果有人發現此問題有任何問題,請在評論中告訴我。

+0

https://groups.google.com/forum/#!topic/comp.std.c/7mSxlJir4Eo發生了什麼; https://stackoverflow.com/questions/1694266/validate-max-integer-in-scanf代替做什麼。 – Ryan

+0

@Ryan我不是在詢問驗證,我只是想知道會發生什麼 – CuriosGuy

+0

@CuriosGuy:好的,請閱讀第一個鏈接。 – Ryan

回答

2

這是未定義的行爲。所述C11草案說:

[...]的轉換的結果被放置在對象指向的 第一個參數以下還沒有已經接收到 轉換結果的格式參數。如果此對象沒有適當的類型,或者如果轉換的結果不能在對象中表示,則行爲是不確定的。

+0

先生,標記我的問題的人問這裏http://stackoverflow.com/questions/16056758/cc-unsigned-integer-overflow,這是不正確的,因爲我在說輸入 – CuriosGuy

+0

嗯,是轉換的結果文字''4294967298「'到'2U'沒有很好的定義? (NMDV)考慮「0.1」和「%f」,結果不能被_exactly_表示。所以在「轉換無法表現」的意義上必定會有一些軟糊糊。 – chux

+0

@CuriosGuy:這個答案*是關於輸入的。 – Ryan

4

未定義的行爲將被調用。

報價從N1570 7.21.6.2 fscanf函數,第10段:

如果該對象 不具有適當的類型,或者如果轉換的結果不能表示在對象 ,所述行爲未定義。

+0

你在我的[評論]上的下半場的想法(http://stackoverflow.com/questions/42162536/what-happens-if-i-input-number-more-than-the-range-of-data-type- in-c#comment71490209_42162589),因爲它們也適用於此。 – chux

+0

http://stackoverflow.com/a/32648957/5473170你能證明這個答案說什麼? – CuriosGuy

相關問題