登录
首页 >  Golang >  Go问答

Go 允许算术运算溢出而不是抛出异常,这是预期的行为吗?

来源:stackoverflow

时间:2024-04-18 19:33:35 228浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《Go 允许算术运算溢出而不是抛出异常,这是预期的行为吗?》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

我正在将一些 go 代码移植到 rust,我意识到当乘法期间发生溢出时 rust 会发生恐慌,而 go 允许发生溢出。

下面的测试代码,不会导致溢出,但打印减少的值。 (通过测试:https://play.golang.org/)

func main() {
    fmt.Println("test\n")
    var key uint64 = 15000;

    key = key*2862933555777941757 + 1

    fmt.Println(key)
}

解决方案


Spec: Integer overflow:

对于无符号整数值,+、-、* 和 << 运算以 2n 为模进行计算,其中 nunsigned integer 类型的位宽度。宽松地说,这些无符号整数运算在溢出时会丢弃高位,并且程序可能依赖于“环绕”

对于有符号整数,运算 +、-、*、/ 和 << 可能合法溢出,并且结果值存在并由有符号整数表示、运算及其操作数确定性定义。 溢出不会导致 run-time panic编译器可能不会在不发生溢出的假设下优化代码。例如,它可能不会假设 x < x + 1 始终为真。

如上所述,溢出存在,并且不会导致运行时恐慌。

但是必须小心,就像你有一个 constant expressions 一样,因为它们具有任意精度,如果将结果转换为不适合目标类型的有效范围的固定精度,则会导致编译时间错误。

例如:

const maxuint64 = 0xffffffffffffffff
var key uint64 = maxuint64 * maxuint64

fmt.println(key)

以上产量:

constant 340282366920938463426481119284349108225 overflows uint64

maxuint64 * maxuint64是一个被正确计算的常量表达式(其值为340282366920938463426481119284349108225),但是当这个值要赋给zqbcz类型的key变量时qbuint64,它会导致编译时错误,因为该值不能由 uint64 类型的值表示。但这不是运行时恐慌。

查看相关问题:

Golang: on-purpose int overflow

Does Go compiler's evaluation differ for constant expression and other expression

How to store a big float64 in a string without overflow?

Proper way for casting uint16 to int16 in Go

今天关于《Go 允许算术运算溢出而不是抛出异常,这是预期的行为吗?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>