第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

為什么字節(jié)轉換會不一致地爆炸golang?

為什么字節(jié)轉換會不一致地爆炸golang?

Go
qq_笑_17 2022-01-17 17:06:51
我有以下示例,取自 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.


查看完整回答
反對 回復 2022-01-17
  • 1 回答
  • 0 關注
  • 214 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號