func main() {
var a uint8 = math.MaxUint8
fmt.Println(a)
fmt.Println(a + a)
}
// 结果居然是 254 ,和溢出的计算方法一样,去掉了字节高位 但是为什么呢 不符合大众的预期啊 感谢感谢
有疑问加站长微信联系(非本文作者)

func main() {
var a uint8 = math.MaxUint8
fmt.Println(a)
fmt.Println(a + a)
}
// 结果居然是 254 ,和溢出的计算方法一样,去掉了字节高位 但是为什么呢 不符合大众的预期啊 感谢感谢
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
`单行代码`
@zzustu 感谢,知道将高位字节丢弃了,我的问题就是为什么要丢失 , 难道在 golang 中 uint8 + uint8=uint8 ?
类型相同的相加,最后肯定还是原来的类型
@polaris 感谢北大才子
代码检验好像是这样的 目前还没有看到哪里有文档描述这个
Java运算时有数据类型自动提升这么一回事,go没有所谓的数据类型自动提升,是数字类型但不同的数据类型也不能进行运算, 比如: uint8 + uint16 不能编译。而Java可以 short + int
@zzustu 感谢感谢 所以在 golang 中,做加法、乘法 等待运算时,一不小心就溢出了 而且是默默的 真要很小心。。是不是还要写一个辅助函数来判断 相加的结果 是不是介于 0到255之间,如是的话则可以,否则就panic
var b byte = 5 fmt.Printf("%T %d", 255+b, 255+b)
更让人迷糊的代码,int 的 255常量 加 byte 结果会丢弃高位,还是转换到 int ? 有兴趣试下Go 语言规范看看
@polaris 感谢感谢,这就去看下