避免在Ruby中从Fixnum自动转换为Bignum

时间:2011-06-27 14:33:19

标签: ruby type-conversion

我正在将一个算法从C#移植到Ruby。该算法有一种方法可以返回有时溢出的int

    private static int NextRandom(int n)
    {
        return 1234567890 * n + 12345;
    }

该算法利用溢出来避免此函数返回的值超出范围。但是,Ruby的行为方式不同,它会自动将值转换为Bignum,这似乎没有限制......如何在Ruby中实现相同的目标?

2 个答案:

答案 0 :(得分:6)

如果您想要一个数字在某个级别换行,您可能需要手动限制它:

def next_random(n)
  (1234567890 * n + 12345) % 0x7FFFFFFF
end

您可以选择任何您想要的限制,该示例是32位签名。

我认为你无法将数值计算锁定到任意范围。

答案 1 :(得分:0)

一种可能的解决方案是编写一个包装器OverflowingInteger并按预期手动溢出。缺点是您需要将所有Integer转换为OverflowingInteger,至少在计算期间。