=========加法运算结果不符合预期=========

FreeWong · 2021-08-31 17:07:43 · 2517 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-08-31 17:07:43 的主题,其中的信息可能已经有所发展或是发生改变。

func main() {

    var a uint8 = math.MaxUint8
    fmt.Println(a)

    fmt.Println(a + a)

}

// 结果居然是 254 ,和溢出的计算方法一样,去掉了字节高位 但是为什么呢 不符合大众的预期啊 感谢感谢


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2517 次点击  
加入收藏 微博
10 回复  |  直到 2023-05-15 15:37:27
zzustu
zzustu · #1 · 4年之前
     1111 1111
 +   1111 1111 
───────────────
   1 1111 11108字节 1111 1110 = 254
FreeWong
FreeWong · #2 · 4年之前

@zzustu 感谢,知道将高位字节丢弃了,我的问题就是为什么要丢失 , 难道在 golang 中 uint8 + uint8=uint8 ?

polaris
polaris · #3 · 4年之前

类型相同的相加,最后肯定还是原来的类型

FreeWong
FreeWong · #4 · 4年之前

@polaris 感谢北大才子 :smile: 代码检验好像是这样的 目前还没有看到哪里有文档描述这个

zzustu
zzustu · #5 · 4年之前

Java运算时有数据类型自动提升这么一回事,go没有所谓的数据类型自动提升,是数字类型但不同的数据类型也不能进行运算, 比如: uint8 + uint16 不能编译。而Java可以 short + int

FreeWong
FreeWong · #6 · 4年之前

@zzustu 感谢感谢 所以在 golang 中,做加法、乘法 等待运算时,一不小心就溢出了 而且是默默的 真要很小心。。是不是还要写一个辅助函数来判断 相加的结果 是不是介于 0到255之间,如是的话则可以,否则就panic

FreeWong
FreeWong · #7 · 4年之前

var b byte = 5 fmt.Printf("%T %d", 255+b, 255+b) 更让人迷糊的代码,int 的 255常量 加 byte 结果会丢弃高位,还是转换到 int ? 有兴趣试下

polaris
polaris · #8 · 4年之前
FreeWongFreeWong #4 回复

@polaris 感谢北大才子 :smile: 代码检验好像是这样的 目前还没有看到哪里有文档描述这个

Go 语言规范看看

FreeWong
FreeWong · #9 · 4年之前

@polaris 感谢感谢,这就去看下

Neightly
Neightly · #10 · 2年之前
func add[signed ~int | ~int8 | ~int16 | ~int32 | ~int64](x, y signed) signed {
    s := x + y
    if (x^s)&(y^s) < 0 { // (+) + (+) = (-) || (-) + (-) = (+)
        panic("signed overflow")
    }
    return s
}

func subtract[signed ~int | ~int8 | ~int16 | ~int32 | ~int64](x, y signed) signed {
    d := x - y
    if (x^y)&(x^d) < 0 { // (+) - (-) = (-) || (-) - (+) = (+)
        panic("signed overflow")
    }
    return d
}
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传