为什么字节转换不一致golang?

时间:2016-06-09 17:37:25

标签: go binary byte bitwise-operators

我有以下示例,取自Addison-Wesley Golang一书,我稍作修改:

package main

import "fmt"

// pc[i] is the population count of i.
var pc [256]byte

func 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))
}

这里的操场上的代码相同:example-code 如果链接过期,可以在操场上粘贴上面的内容并播放:go playground

如果取消注释

// fmt.Println(byte(256>>(0*8)))

您收到错误消息:

prog.go:31: constant 256 overflows byte

鉴于这是在PopCount中完成而没有爆炸,我不明白发生了什么。有人可以帮助解释为什么当我在main中执行它而不是在函数PopCount中它会爆炸?

我敢说我错过了一些明显的东西!

1 个答案:

答案 0 :(得分:4)

这是因为256>>(0*8)(相当于256)是一个无类型常量,它太大而不适合byte language spec状态中的规则< / p>

  

在任何这些情况下,常数值x都可以转换为类型T:

     
      
  • x可由类型T的值表示。
  •   
  • x是一个浮点数   常量,T是浮点型,x可用a表示   使用IEEE 754舍入到偶数规则进行舍入后的类型T的值,但是   使用IEEE -0.0进一步舍入为无符号0.0。常数   T(x)是舍入值。
  •   
  • x是整数常量,T是字符串   类型。在这种情况下,适用与非常数x相同的规则。
  •   

PopCount函数中,256值的类型为uint64,可以将其转换为byte,将其截断为0