2011-09-09 26 views
5

Tôi hiện đang chuyển đổi một thuật toán từ Java sang Ruby, và tôi đã nhấn một chút của một lỗi với việc thiếu số nguyên tràn trong Ruby.Làm cách nào để mô phỏng số nguyên tràn trên biến Fixnum?

Nói rằng tôi có một giá trị của 2663860877, đây là lớn hơn số nguyên max 2147483648.

Trong Java, nó kết thúc tốt đẹp xung quanh và tôi sẽ nhận được -1631106419.

tôi thấy chút mã này, nhưng nó dường như không có tác dụng:

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

And'ing biến không buộc nó tiêu cực như bạn mong muốn.

+1

Bạn có thể muốn xem xét lại việc thực hiện các thuật toán như một tổng thể thay vì cố gắng transliterate Java để Ruby. Các số trong Ruby là các số, chúng không phải là một vùng chứa thuận tiện cho một chuỗi các bit. –

Trả lời

6

Giả sử số nguyên 32bit với hai của âm bổ sung này nên làm việc:

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 
Các vấn đề liên quan