Целочисленный детерминизм

Я просто хочу спросить, являются ли целые числа детерминированными? Я знаю, что они должны быть, но они одинаковы на всех платформах?

Я сделал поиск в Google, но единственное, что он вернул, было то, как соединить два числа, и глубокое исследование предмета детерминизма.

Причина, по которой я спрашиваю, заключается в том, что я планирую разработать небольшую демонстрацию, в которой используется модель сети с фиксированным шагом. На экране будет пара блоков, которые можно будет перемещать с помощью команд, и мы собирались дать целые значения всем блокам.

Это также заставило меня задуматься об общих играх RTS, которые всегда должны бороться с рассинхронизацией с числами с плавающей запятой (это не единственная причина, по которой они рассинхронизируются, но все еще является основным фактором в рассинхронизации). Почему в этих играх просто не используются 64-битные целые числа для хранения всех позиций юнитов и т. Д. Я думаю, что 64-битные возможности хранения различных значений gazilion будут более чем достаточны для обработки позиций юнитов и т. Д.

0

Решение

За редкими исключениями (например, время доступа к памяти и случайные операции, такие как RDRAND), все операции с ЦП являются детерминированными, включая как целочисленные, так и операции с плавающей точкой.

Расстройства в сетевых играх, как правило, являются результатом ошибок в игровой логике, а не архитектурных проблем.

1

Другие решения

До некоторой степени Результаты арифметических операций всегда будут одинаковыми, пока ни одна из операций не переполнится. Результат переполнения целого числа со знаком не определен. Оптимизация компилятора может привести к различным результатам даже в пределах одного и того же вызова программы. Результат переполнения без знака четко определен; результаты всегда будут одинаковыми, если две платформы имеют одинаковое значение для UINT_MAX. Вы также не можете полагаться на фактическое двоичное представление, которое использует платформа. Вам придется использовать некоторую форму сериализации, если вы хотите передавать целые числа между различными машинами.

1

Есть несколько важных случаев неопределенного поведения; например, если ваше выражение генерирует целочисленное значение со знаком за пределами границ, даже в качестве промежуточного шага, то буквально может произойти все, что угодно. (И «за пределами» зависит в некоторой степени от системы; intнапример, не гарантируется, что он будет точно 32-разрядным.) Существуют также некоторые случаи поведения, определяемого реализацией; например, смещение вправо целочисленного значения со знаком минус определяется реализацией, что означает, что компилятор может решить, как он хочет его обработать, и должен задокументировать это решение.

И, конечно же, в случае многопоточности почти все ставки отключены, если вы не позаботитесь о правильной обработке синхронизации.

Но если вы избежите этих случаев, то — нет платформ, на которых 2+2 будет что-то другое, чем 4,

1