Как эмулировать целочисленное переполнение для переменной Fixnum? - PullRequest
6 голосов
/ 09 сентября 2011

В настоящее время я конвертирую алгоритм из 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 Ответ

7 голосов
/ 09 сентября 2011

Предполагая, что 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
...