V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
bin381
V2EX  ›  Go 编程语言

问一个 Go 类型转换问题

  •  
  •   bin381 · 2017-09-29 16:07:22 +08:00 · 1464 次点击
    这是一个创建于 2394 天前的主题,其中的信息可能已经有所发展或是发生改变。

    var x uint64 = 257

    var y int = 257

    fmt.Println("rv is ", rv)

    fmt.Println("rv2 is ", byte(x))

    fmt.Println("rv3 is ", byte(y))

    fmt.Println("rv3 is ", byte(int(257))) # constant 257 overflows byte 这里报错了

    第 1 条附言  ·  2017-09-29 19:55:13 +08:00
    var y int = 257
    fmt.Println("rv3 is ", byte(y)) # 这里是没有问题的
    fmt.Println("rv3 is ", byte(int(257))) # 这里报错了

    =================

    var x uint64 = 257
    fmt.Println("rv2 is ", byte(x)) #这是没有问题的

    按道理都是 int 转 byte,应该都报错才对呢
    7 条回复    2017-10-10 18:54:46 +08:00
    zdt3476
        1
    zdt3476  
       2017-09-29 16:12:56 +08:00
    所以,想问啥?
    mason961125
        2
    mason961125  
       2017-09-29 16:13:27 +08:00
    你把 int 转换成 byte 肯定溢出阿...int 占用空间比 byte 大多了
    C0reFast
        3
    C0reFast  
       2017-09-29 16:14:39 +08:00
    这个应该是编译期检查,257 是超出 byte 类型表达能力的,直接用 byte(257)和 var z byte = 257 是一样的。其他两个都是运行时了。
    bin381
        4
    bin381  
    OP
       2017-09-29 19:51:50 +08:00
    fmt.Println("rv3 is ", byte(y)) 这里是没有报错的
    fmt.Println("rv3 is ", byte(int(257))) 这个是报错了
    bin381
        5
    bin381  
    OP
       2017-09-29 19:52:55 +08:00
    @zdt3476
    @mason961125

    我补充了说明
    cholerae
        6
    cholerae  
       2017-09-29 20:06:59 +08:00   ❤️ 1
    Go 对常量和非常量的类型转换规则是不一样的。

    https://golang.org/ref/spec#Conversions

    常量转换会判定这个值能否用目标类型表示,非常量只会判类型是否符合转换条件。
    iceheart
        7
    iceheart  
       2017-10-10 18:54:46 +08:00 via Android
    257 是立即数,byte 装不下,编译器不知道咋处理,当然报错啦。
    用变量转 byte,溢出了是另一回事,编译器不关心这个,所以编译过啦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2786 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:05 · PVG 12:05 · LAX 21:05 · JFK 00:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.