我一直在制作“A Tour of Go”,并在 Pic 函數(shù)中發(fā)生了一些奇怪的行為。它涉及int -> uint8轉(zhuǎn)換。dx和dy的值在程序執(zhí)行時默認為256。這樣嵌套 for 循環(huán)內(nèi)的x+y就會上升到510!(255+255)盡管如此,Golang 在將溢出的x+y轉(zhuǎn)換為 uint8 時沒有看到任何問題,但是當我將其更改為一些硬編碼值時,比如說 uint8(321),我立即得到一個溢出錯誤。有人可以向我解釋這種奇怪的行為嗎?package mainimport "golang.org/x/tour/pic"func Pic(dx, dy int) [][]uint8 { canvas := make([][]uint8, dy) for y := 0; y < dy; y++ { canvas[y] = make([]uint8, dx) for x := 0; x < dx; x++ { canvas[y][x] = uint8(x+y) // <- here it is } } return canvas;}func main() { pic.Show(Pic)}獲得的錯誤:go: finding module for package golang.org/x/tour/picgo: downloading golang.org/x/tour v0.0.0-20200508155540-0608babe047dgo: found golang.org/x/tour/pic in golang.org/x/tour v0.0.0-20200508155540-0608babe047d./prog.go:11:24: constant 321 overflows uint8Go build failed.
1 回答

互換的青春
TA貢獻1797條經(jīng)驗 獲得超6個贊
這是來自語言規(guī)范:
類型化常量的值必須始終可以由常量類型的值準確表示。以下常量表達式是非法的:
uint(-1) // -1 不能表示為單位
int(3.14) // 3.14 不能表示為 int
在您的情況下,x
and y
are int
,x+y
也是int
,并且uint8(x+y)
只是截斷結(jié)果。但是,uint8(321)
根據(jù)語言規(guī)范無效。但是,這是有效的:
i:=321 x:=uint8(i)
- 1 回答
- 0 關(guān)注
- 166 瀏覽
添加回答
舉報
0/150
提交
取消