亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無符號整數溢出

無符號整數溢出

Go
aluckdog 2021-07-28 13:05:26
去規范說無符號整數溢出:對于無符號整數值,運算 +、-、* 和 << 是以 2n 為模計算的,其中 n 是無符號整數類型的位寬。粗略地說,這些無符號整數運算會在溢出時丟棄高位,并且程序可能依賴于 ''wrap around''。我嘗試對其進行測試,但得到的結果不一致 - http://play.golang.org/p/sJxtSHbigT:package mainimport "fmt"func main() {    fmt.Println("test")    var num uint32 = 1 << 35}這給出錯誤:prog.go:7: constant 34359738368 overflows uint32 [process exited with non-zero status]但是根據規范應該沒有錯誤,而是我應該看到 0。
查看完整描述

2 回答

?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

您引用的規范特指“操作 +、-、* 和 <<”的結果。您正在嘗試定義一個常量,而不是查看其中一個操作的結果。


您也不能將那些過大的值用于這些操作的輸入。編譯器不會為您包裝任何值;這只是這些操作的運行時行為。


package main


import "fmt"


func main() {

    var num uint32 = 1 + 1 << 35

    fmt.Printf("num = %v\n", num)

}

prog.go:6: constant 34359738369 overflows uint32

 [process exited with non-zero status]

這是一個有趣的例子。


var num uint32 = (1 << 31) + (1 << 31)

fmt.Printf("num = %v\n", num)

prog.go:6: constant 4294967296 overflows uint32

 [process exited with non-zero status]

在這種情況下,編譯器嘗試(1 << 31) + (1 << 31)在編譯時進行求值4294967296,生成常量 value ,該值太大而無法容納。


var num uint32 = (1 << 31)

num += (1 << 31)

fmt.Printf("num = %v\n", num)

num = 0

在這種情況下,加法是在運行時執行的,并且值會按照您的預期回繞。


查看完整回答
反對 回復 2021-08-02
  • 2 回答
  • 0 關注
  • 325 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號