回答
可能會發生溢出,因爲二進制補碼中整數表示的範圍不對稱:可以表示的最小負數的幅度是可以表示的最大正數的幅度加1。例如,在32位系統上,值爲-2,147,483,648
和2,147,483,647
。這就是爲什麼否定-2,147,483,648
會導致溢出的原因:否定的結果爲正值2,147,483,648
,不能用相同大小的int
表示。
請注意此問題的逆是不正確的:否定一個正數不會導致溢出:
if (i > 0) { i = -i; } // No overflow here
@Tom請注意,MSVC在'limits.h'中有'#define INT_MIN(-2147483647 - 1)'。 –
明白...非常感謝 – Tom
的原因整數溢出是在運算試圖創建一個數值即在可以用給定位數表示的範圍之外,或者大於最大值或者小於最小可表示值。
- 那麼,在你的情況下,變量
i
未初始化。所以在這裏會發生什麼是分配給變量i
整數類型的內存空間將包含一些垃圾值。 - 如果內存地址包含最大可能的整數值
-2^31(-2,147,483,648)
,那麼否定此值將導致整數溢出。
我希望這有助於。
當main啓動時,您的堆棧中的「i」值是未定義的。調用main()之前運行的啓動代碼可以在那裏留下任何東西。
Addig對Kashif說什麼,負整數可以比非負整數低一個數值,因爲負數不需要留下零空間。當符號反轉時,符號位中的「1」(所有剩餘位爲零)會導致溢出。
在16位:-0x8000 ==〜爲0x8000 + 1 == 0x7FFF的+ 1 ==爲0x8000
// 「 - 」 負值==反相+ 1 ==反轉+ 1 ==最終是相同的
該值的可能性很低,但存在。它不會發生,除非堆棧恰好包含違規號碼。
- 1. 爲什麼會發生溢出?
- 2. 下溢或溢出的指針會發生什麼?
- 3. Python浮點溢出,float溢出時會發生什麼?
- 4. 爲什麼在下面的場景中會發生StackOverflowError?
- 5. 爲什麼堆棧溢出不會發生?
- 6. 這個錯誤是什麼,爲什麼會發生?下面
- 7. 爲什麼下面的程序不會生成任何可見的輸出?
- 8. 爲什麼下面的程序會出錯?
- 9. 爲什麼發生字節溢出,它們實現了什麼?
- 10. 爲什麼在發佈版本中會出現堆棧下溢(錯誤1024)?
- 11. 爲什麼這兩行會產生不同的溢出行爲?
- 12. Swing程序中的標準輸出會發生什麼?
- 13. 在64位機器上發生32位整數溢出時會發生什麼?
- 14. 自動遞增主鍵的整數溢出會發生什麼?
- 15. 當RabbitMQ的交付標籤溢出時會發生什麼?
- 16. 這個程序爲什麼產生堆棧溢出錯誤?
- 17. 這個程序爲什麼會導致溢出?
- 18. 爲什麼下面的代碼不會產生任何輸出?
- 19. 這個輸出爲什麼會發生?
- 20. 什麼會導致Phong鏡面陰影產生色域溢出?
- 21. 如果我溢出OpenGL矩陣堆棧會發生什麼?
- 22. 當時間戳(rowversion)溢出時會發生什麼?
- 23. 這裏爲什麼會溢出?
- 24. 當C表達式發生整數溢出時會發生什麼?
- 25. 爲什麼下面的程序給出了輸出:A
- 26. 爲什麼在頁面上出現彈出窗口時發生會話輸出?
- 27. 爲什麼這不會產生雙重下溢?
- 28. 爲什麼在下面的Java代碼中的Thread輸出中2次i = 0?如果我們創建多個線程會發生什麼?爲什麼?
- 29. 爲什麼在這個規則中會出現遞歸溢出?
- 30. 爲什麼會發生? java
未定義的行爲。該變量未被初始化。並且否定最負的可能整數在二進制補碼運算中產生相同的值 –
在2的補碼中, INT_MIN | > INT_MAX – BLUEPIXY
當'i == INT_MIN'以2的補碼錶示時。 –