Jef*_*ams 6 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
Run Code Online (Sandbox Code Playgroud)
并且变量并不像你期望的那样强迫它消极.
假设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
Run Code Online (Sandbox Code Playgroud)