问一个 Go 类型转换问题

2017 年 9 月 29 日
 bin381

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 这里报错了

2701 次点击
所在节点    Go 编程语言
7 条回复
zdt3476
2017 年 9 月 29 日
所以,想问啥?
mason961125
2017 年 9 月 29 日
你把 int 转换成 byte 肯定溢出阿...int 占用空间比 byte 大多了
C0reFast
2017 年 9 月 29 日
这个应该是编译期检查,257 是超出 byte 类型表达能力的,直接用 byte(257)和 var z byte = 257 是一样的。其他两个都是运行时了。
bin381
2017 年 9 月 29 日
fmt.Println("rv3 is ", byte(y)) 这里是没有报错的
fmt.Println("rv3 is ", byte(int(257))) 这个是报错了
bin381
2017 年 9 月 29 日
@zdt3476
@mason961125

我补充了说明
6ufq0VLZn0DDkL80
2017 年 9 月 29 日
Go 对常量和非常量的类型转换规则是不一样的。

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

常量转换会判定这个值能否用目标类型表示,非常量只会判类型是否符合转换条件。
iceheart
2017 年 10 月 10 日
257 是立即数,byte 装不下,编译器不知道咋处理,当然报错啦。
用变量转 byte,溢出了是另一回事,编译器不关心这个,所以编译过啦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/394633

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX