我有以下示例,取自 Addison-Wesley Golang 書中,我對其稍作修改:package mainimport "fmt"// pc[i] is the population count of i.var pc [256]bytefunc init() { for i := range pc { pc[i] = pc[i/2] + byte(i&1) }}// PopCount returns the population count (number of set bits) of x.func PopCount(x uint64) int { fmt.Printf("Value is %d\n", x) fmt.Printf("byte(%d>>(0*8)) is %d\n", x, byte(x>>(0*8))) y := byte(x>>(0*8)) return int(pc[y] + pc[byte(x>>(1*8))] + pc[byte(x>>(2*8))] + pc[byte(x>>(3*8))] + pc[byte(x>>(4*8))] + pc[byte(x>>(5*8))] + pc[byte(x>>(6*8))] + pc[byte(x>>(7*8))])}func main() { // fmt.Println(byte(256>>(0*8))) // This blows up, but doesn't blow up on line 19 or line 20, why? fmt.Println(PopCount(256))}這是 Playground 中的相同代碼:example-code 以防萬一鏈接過期,這里是 Playground,您可以粘貼上面的內(nèi)容并玩:go playground如果你取消注釋// fmt.Println(byte(256>>(0*8)))你得到一個錯誤:prog.go:31: constant 256 overflows byte鑒于這是在 PopCount 內(nèi)部完成而沒有爆炸,我不明白發(fā)生了什么。有人可以幫助解釋為什么當我在 main 中而不是在函數(shù) PopCount 中這樣做時它會爆炸嗎?我敢說我錯過了一些明顯的東西!
1 回答

開滿天機
TA貢獻1786條經(jīng)驗 獲得超13個贊
這是因為256>>(0*8)
(等價于256
),是一個無類型常量,它太大而無法適應語言規(guī)范狀態(tài)byte
中的規(guī)則
在以下任何一種情況下,常量值 x 都可以轉換為類型 T:
x 可以用 T 類型的值表示。
x 是浮點常數(shù),T 是浮點類型,并且 x 在使用 IEEE 754 舍入到偶數(shù)規(guī)則進行舍入后可以由 T 類型的值表示,但 IEEE -0.0 進一步舍入為無符號 0.0 . 常數(shù) T(x) 是四舍五入的值。
x 是一個整數(shù)常量,T 是一個字符串類型。與非常量 x 相同的規(guī)則適用于這種情況。
在您的PopCount
函數(shù)內(nèi)部,該256
值的類型為uint64
,可以將其轉換為 a byte
,將其截斷為0
.
- 1 回答
- 0 關注
- 214 瀏覽
添加回答
舉報
0/150
提交
取消