程式設計基礎/整數溢位
當算術運算試圖建立一個超出給定位數所能表示的範圍的數值時,就會發生整數溢位 - 要麼大於最大值,要麼小於最小可表示值。[1]
溢位最常見的結果是儲存結果的最低有效位;結果被認為環繞最大值(即模二的冪)。溢位條件可能給出導致意外行為的結果。特別是,如果未預料到這種可能性,溢位可能會損害程式的可靠性和安全性。[2]
有時字元和整數資料型別被歸為一類,因為它們的行為都相同(通常稱為整數族)。更確切地說,它們的行為不同於浮點資料型別。整數族的值從一個值跳到另一個值。6 和 7 之間,以及 ‘A’ 和 ‘B’ 之間什麼都沒有。可能會問為什麼不將所有數字都設定為浮點資料型別?原因有兩點。首先,現實世界中有些東西不是分數。一隻狗,即使只有 3 條腿,也仍然是一條狗,而不是四分之三條狗。其次,整數資料型別通常用於透過計數(計數迴圈)來控制程式流程。整數族具有迴圈環繞特性。使用一個兩位元組整數,大於 32767 的下一個數字是負 32768(字元的行為方式相同,從 255 到 0。我們也可以反過來,使負 32768 的下一個較小數字是正 32767。這可以透過使用一條正常的數學線,限制域,然後連線兩端形成一個圓圈來顯示。
這種整數族的迴圈性質適用於整數和字元資料型別。從理論上講,它也應該適用於布林資料型別;但在大多數程式語言中,由於各種技術原因,它不適用於布林資料型別。
“在數學中,模算術(有時稱為時鐘算術)是一種針對整數的算術系統,其中數字在達到某個值(模數)後“環繞”。…
模算術的一個常見應用是它在 12 小時制時鐘中的使用,即將一天分為兩個 12 小時的時間段。如果現在是 7:00,那麼 8 小時後將是 3:00。常規加法會建議較晚的時間應該是 7 + 8 = 15,但這並非正確答案,因為時鐘時間每 12 小時“環繞”一次;沒有“15 點”。同樣,如果時鐘從 12:00(中午)開始,經過 21 小時,則時間將是第二天 9:00,而不是 33:00。由於小時數在達到 12 時會重新開始,因此這是模 12 算術。
時鐘上的時間記錄提供了模算術的示例。”(維基百科的模算術)
模運算子在整數除法中的使用與模算術中使用的概念有關。
如果程式設計師錯誤地設定了計數迴圈,通常會發生以下三種情況之一
- 無限迴圈 - 通常由缺少更新屬性引起。
- 迴圈從未執行 - 通常,文字表示式是錯誤的,小於或大於關係的方向需要切換。
- 迴圈執行的次數超過預期 - 更新處理不當。通常,計數方向(遞增或遞減)需要切換。
讓我們舉一個迴圈執行看似無限次(我們列表中的第三項)的例子。
for int x = 0, x < 10, x--
Output x
上面的程式碼意外地遞減,x 的值以負數的方式朝 -2147483648(普通四位元組有符號整數資料型別中最大的負值)移動。它可能需要一段時間(因此可能看起來是無限迴圈)才能達到負 20 億多的值,然後最終遞減到正 2147483647。這會間接停止迴圈執行。
- 迴圈性質
- 連線整數族資料型別域的負數和正數端。
- 迴圈控制
- 確保迴圈的屬性得到妥善處理。
- 模算術
- 一種針對整數的算術系統,其中數字“環繞”。