如何模拟 Fixnum 变量的整数溢出?
我目前正在将算法从 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
并且变量不会像您期望的那样强制它为负值。
I'm currently converting an algorithm from Java to Ruby, and I've hit a bit of a snag with the lack of integer overflowing in Ruby.
Say I have a value of 2663860877, this is bigger than the max integer 2147483648.
In Java, it wraps around and I should get -1631106419.
I found this bit of code, but it doesn't seem to be working:
def force_overflow(i)
if i < -2147483648
-(-(i) & 0xffffffff)
elsif i > 2147483647
i & 0xffffffff
else
i
end
end
And'ing the variable doesn't force it negative like you'd expect.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
假设 32 位整数带有二进制补码负数,这应该可以工作:
Assuming 32bit integers with two's complement negatives this should work: