1 回答

TA貢獻1856條經驗 獲得超17個贊
規范:整數溢出:
對于無符號整數值,操作 +、-、* 和 << 計算模 2?n,其中n是無符號整數類型的位寬。粗略地說,這些無符號整數運算在溢出時丟棄高位,程序可能依賴于“環繞”。
對于有符號整數,操作 +、-、*、/ 和 << 可能會合法溢出,并且結果值存在并且由有符號整數表示、操作及其操作數確定地定義。溢出不會導致運行時恐慌。假設不會發生溢出,編譯器可能不會優化代碼。例如,它可能不會假設這
x < x + 1
總是正確的。
如上所述,存在溢出并且不會導致運行時恐慌。
但必須小心,就好像你有一個常量表達式,因為它們具有任意精度,如果要將結果轉換為不適合目標類型有效范圍的固定精度,則會導致編譯時間 -錯誤。
例如:
const maxuint64 = 0xffffffffffffffff
var key uint64 = maxuint64 * maxuint64
fmt.Println(key)
以上產量:
constant 340282366920938463426481119284349108225 overflows uint64
maxuint64 * maxuint64是一個計算正確的常量表達式(它的值為340282366920938463426481119284349108225),但是當這個值被賦值給keytype 的變量uint64時,它會導致編譯時錯誤,因為這個值不能用 type 的值表示uint64。但這不是運行時恐慌。
- 1 回答
- 0 關注
- 166 瀏覽
添加回答
舉報