我正在将一个C ++库移植到Ruby,并且我无法复制int64溢出行为。
如果我在bash(或c ++)上进行这种乘法,我得到一个负数,因为如果2^63 value:
> let "iv=1436440203*833471*380*1436440203" ; echo $iv
-4353333299339738780
但Ruby将其转换为BigNumber并给出预期结果:
[1] pry(main)> 1436440203*833471*380*1436440203
=> 653505419248345501939646820
[2] pry(main)> (1436440203*833471*380*1436440203).class
=> Bignum
如何强制Ruby复制C ++ / bash行为?
另外,我已经看过这个问题(Emulating int64 overflows in Ruby),我觉得它不一样。
执行mod操作符也不会给我一个否定结果
[3] pry(main)> (1436440203*833471*380*1436440203) % 2**64
=> 14093410774369812836
[4] pry(main)> (1436440203*833471*380*1436440203) % 2**63
=> 4870038737515037028