Golang 怪异 big.Int 少量位数的行为
Golang weird big.Int behavior for small number of bits
我正在尝试通过欧几里得方法计算两个数的 GCD,并注意到奇怪的行为。虽然我将数字的值传递给函数,但是对于位数较少(通常小于 64)的数字,数字会被函数修改。谁能代表我澄清这是一个错误还是预期的行为?您可以在此处查看 playground 中的代码:Golang playground example
我认为预期的行为是不应通过将值传递给我的函数来更改任何值。感谢您的帮助,我在搜索的最后一天找不到任何其他类似的事件。
big.Int是一个包含nat的结构体,定义为type nat []Word
所以,虽然你确实在复制 big.Int,但它里面的切片实际上是一个浅拷贝(切片的底层存储是相同的)
为什么更大的位宽没有出现问题,不确定。
可能它需要在某处重新分配并创建一个新的 []Word
从而使原始文件完好无损。
这也可能是标准库通常 returns *big.Int 的原因,因为值不是真正可复制的
这里有一个版本 on play 可以正确复制 big.Int 值。
主要区别在于:
a := new(big.Int).Set(x)
b := new(big.Int).Set(y)
(一般使用指针作为值不是特别有用)
我正在尝试通过欧几里得方法计算两个数的 GCD,并注意到奇怪的行为。虽然我将数字的值传递给函数,但是对于位数较少(通常小于 64)的数字,数字会被函数修改。谁能代表我澄清这是一个错误还是预期的行为?您可以在此处查看 playground 中的代码:Golang playground example
我认为预期的行为是不应通过将值传递给我的函数来更改任何值。感谢您的帮助,我在搜索的最后一天找不到任何其他类似的事件。
big.Int是一个包含nat的结构体,定义为type nat []Word
所以,虽然你确实在复制 big.Int,但它里面的切片实际上是一个浅拷贝(切片的底层存储是相同的)
为什么更大的位宽没有出现问题,不确定。
可能它需要在某处重新分配并创建一个新的 []Word
从而使原始文件完好无损。
这也可能是标准库通常 returns *big.Int 的原因,因为值不是真正可复制的
这里有一个版本 on play 可以正确复制 big.Int 值。 主要区别在于:
a := new(big.Int).Set(x)
b := new(big.Int).Set(y)
(一般使用指针作为值不是特别有用)