Я просто хочу спросить, являются ли целые числа детерминированными? Я знаю, что они должны быть, но они одинаковы на всех платформах?
Я сделал поиск в Google, но единственное, что он вернул, было то, как соединить два числа, и глубокое исследование предмета детерминизма.
Причина, по которой я спрашиваю, заключается в том, что я планирую разработать небольшую демонстрацию, в которой используется модель сети с фиксированным шагом. На экране будет пара блоков, которые можно будет перемещать с помощью команд, и мы собирались дать целые значения всем блокам.
Это также заставило меня задуматься об общих играх RTS, которые всегда должны бороться с рассинхронизацией с числами с плавающей запятой (это не единственная причина, по которой они рассинхронизируются, но все еще является основным фактором в рассинхронизации). Почему в этих играх просто не используются 64-битные целые числа для хранения всех позиций юнитов и т. Д. Я думаю, что 64-битные возможности хранения различных значений gazilion будут более чем достаточны для обработки позиций юнитов и т. Д.
За редкими исключениями (например, время доступа к памяти и случайные операции, такие как RDRAND
), все операции с ЦП являются детерминированными, включая как целочисленные, так и операции с плавающей точкой.
Расстройства в сетевых играх, как правило, являются результатом ошибок в игровой логике, а не архитектурных проблем.
До некоторой степени Результаты арифметических операций всегда будут одинаковыми, пока ни одна из операций не переполнится. Результат переполнения целого числа со знаком не определен. Оптимизация компилятора может привести к различным результатам даже в пределах одного и того же вызова программы. Результат переполнения без знака четко определен; результаты всегда будут одинаковыми, если две платформы имеют одинаковое значение для UINT_MAX. Вы также не можете полагаться на фактическое двоичное представление, которое использует платформа. Вам придется использовать некоторую форму сериализации, если вы хотите передавать целые числа между различными машинами.
Есть несколько важных случаев неопределенного поведения; например, если ваше выражение генерирует целочисленное значение со знаком за пределами границ, даже в качестве промежуточного шага, то буквально может произойти все, что угодно. (И «за пределами» зависит в некоторой степени от системы; int
например, не гарантируется, что он будет точно 32-разрядным.) Существуют также некоторые случаи поведения, определяемого реализацией; например, смещение вправо целочисленного значения со знаком минус определяется реализацией, что означает, что компилятор может решить, как он хочет его обработать, и должен задокументировать это решение.
И, конечно же, в случае многопоточности почти все ставки отключены, если вы не позаботитесь о правильной обработке синхронизации.
Но если вы избежите этих случаев, то — нет платформ, на которых 2+2
будет что-то другое, чем 4
,