1 回答

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