本人計算機專業,一直對這個問題比較好奇。比方說我寫了一個C程序,可以實現輸入兩個int類型的正整數後,輸出它們的和,但是寫程序時沒有考慮用戶可能會輸入非法內容的情況。之後調試時輸入的數字太大,導致溢出了,這時編譯器不會報錯,而是會輸出一個錯誤的結果,有時甚至還會是負數。請問這從根本講上輸出奇怪的結果是什麼原理呢?


int 類型的數據採用的是補碼的形式,使得內部可以通過加法器實現減法操作。

輸出的數並不奇怪,如果你知道了補碼的規則,你自己也可以算出來會輸出什麼。 詳細的參考下邊的文章。

windliang:趣談計算機補碼?

zhuanlan.zhihu.com圖標

是奇怪結果。

我有這麼一個印象:

C標準指出:整數運算溢出是個未定義行為。

這個有待大家進一步考證。

這就意味著,C標準中未定義行為由實現定義。


C Primer Plus 6e中文版3.4.2 其他數據類型一節中,簡單解釋了整數溢出這一概念

如果你想理解原理,建議看《計算機組成原理》教材中關於補碼運算和有符號、無符號數的相關知識。

另外,C標準指出,有符號數的溢出是未定義行為,編譯器並不一定總是採用截斷處理,有些時候還會造成一些奇怪的問題。因此,應該避免有符號數的溢出。


整數溢出 - CTF Wiki?

wiki.x10sec.org

這個鏈接里有解釋原理,如果還是理解不了的話,建議就慢慢學吧。現在理解不了沒關係,直接記住int有個被限制大小,不要超過就可以了。


或許是你還沒學彙編和數字邏輯的原因?


問題的正確提法是如何把代碼寫正確,而不是錯誤的代碼的行為應該如何解釋。


你是計算機專業的沒學過編譯原理和彙編?而且你都運行了還說什麼編譯器不報錯?你先把你的基礎知識學好吧,計算機專業的連這些東西都不知道那你們學校都教啥了?


你程序都運行起來了還跟編譯器有個鎚子關係。。。

而且出來負數不就是因為溢出嗎?兩正數相加溢出變成負數不是很正常嗎?


推薦閱讀:
相关文章