如何在Fixnum变量上模拟整数溢出?

时间:2011-09-09 18:23:15

标签: ruby math integer overflow

我目前正在将算法从Java转换为Ruby,而且由于Ruby中缺少整数溢出,我遇到了一些麻烦。

假设我的值为2663860877,这大于最大整数2147483648。

在Java中,它包裹起来,我应该得到-1631106419。

我找到了这段代码,但它似乎没有起作用:

def force_overflow(i)
  if i < -2147483648
    -(-(i) & 0xffffffff)
  elsif i > 2147483647
    i & 0xffffffff
  else
    i
  end
end

并且变量不会像你期望的那样强迫它消极。

1 个答案:

答案 0 :(得分:7)

假设32位整数有两个补码负数,这应该有效:

def force_overflow_signed(i)
  force_overflow_unsigned(i + 2**31) - 2**31
end

def force_overflow_unsigned(i)
  i % 2**32   # or equivalently: i & 0xffffffff
end