Например, как в описанном мной ранее случае: "если сделать простое арифметическое действие (4294967295 - 3534543), мы в симуляторе получим 4291432704, тогда как правильный ответ - 4291432752". Разница - 48, это даже не кратно двоичному представлению.
Проблема у меня с битовыми операциями - я не могу получить правильное десятичное число на выходе. Если я конвертирую 32-разрядное двоичное число математическим путем (суммируя произведение бита на двойку в степени разряда), я получаю ошибку суммирования, например, 0b11111111111111111111111111110111 в результате равно 4294967296 (что соответсвует максимальному значению - 0b11111111111111111111111111111111). Можно предположить, что сбоит моя функция. Но если использовать базовую функцию tonumber() - результат тот же.
- Код: Выделить всё
print (tonumber ("11111111111111111111111111110111", 2)) -->> 4294967296
Перевожу двухбитное число в шестнадцатиричное, чтобы потом его преобразовать в десятичное - результат тот же:
- Код: Выделить всё
print (tonumber ("FFFFFFF7", 16)) -->> 4294967296
То есть, по неизвестным мне причинам симулятор во всех этих случаях вернул максимальное 32-битное число - 4294967296. Тогда как верное - 4294967287.
То, что возвращаемые числа во всех случаях конвертирования одинаковые, показывает, что это правильный, с точки зрения симулятора, результат. Но я не понимаю его логику, в моем мире работают другие правила арифметики )))). А самое главное - в других программах тоже. Даже в lua 5.3 эти же функции дают нормальный результат.
Поэтому я не могу как-то уменьшить разрядность этих чисел - так или иначе, но в итоге мне придется их восстанавливать, а это невозможно без арифметических действий, будь то суммирование или побитная сборка.
Поэтому сейчас я вижу 2 пути: или подключать внешнюю библиотеку, которая будет работать по правилам "привычной" арифметики и возвращать уже готовое число, или же писать вообще весь lua-код на битах, фактически - на ассемблере.