问一个 Go 类型转换问题

2017-09-29 16:07:22 +08:00
 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 这里报错了

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

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

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

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

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

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

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

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

© 2021 V2EX