Кто-нибудь встречал авторитетную спецификацию того, как арифметические операции с int и uint работают в ActionScript 3? ( Под «авторитетным» я подразумеваю либо «исходит от Adobe», либо «был объявлен авторитетным Adobe»). В частности, я ищу поддерживаемый способ выполнения целочисленного умножения по модулю 2 32 . Это не описано в любой документации Adobe, которую мне удалось найти.
ActionScript утверждает, что основан на ECMAScript, но ECMAScript вообще не выполняет целочисленную арифметику. Он делает все на IEEE-754, удваивает и уменьшает результат по модулю 2 32 перед побитовыми операциями, что в большинстве случаев имитирует целочисленную арифметику. Однако это не работает для умножения: истинный результат умножения, скажем, 0x10000001 * 0x0FFFFFFF будет слишком длинным для мантисса двойного, поэтому младшие биты будут потеряны, если спецификация следует до буквы.
Теперь введите ActionScript. Я обнаружил экспериментально , что умножение двух переменных int
или uint
и немедленное преобразование продукта в int
или uint
всегда, кажется, дает мне точный результат. Однако сгенерированный байт-код AVM2 просто содержит простую команду "mul" без прямого указания того, что она должна давать целочисленный результат, а не результат с плавающей запятой; виртуальной машине придется смотреть вперед, чтобы узнать это. Я беспокоюсь, что мне просто повезло в моих экспериментах и я получил дополнительную точность в качестве бонуса, а не то, на что я могу положиться.
(Во-первых, все мои эксперименты проводились с использованием проигрывателя Flash x86. Возможно, это представляет промежуточные результаты, так как 80-битный Intel удваивает или сохраняет 64-битное int в оценочном стеке до тех пор, пока не станет известно, для чего он будет использоваться. Ни то, ни другое было бы легко невозможно на планшете без x86 без собственного 32 × 32 → 64 инструкция умножения, так что может виртуальная машина просто решит снизить точность до того, что указано в стандарте ECMAScript?)
24-часовой статус: Майк Уэлш провел небольшое расследование и предоставил очень полезные ссылки, но, к сожалению, недостаточно для закройте вопрос. Кто-нибудь еще?
(tl; dr дебаты в комментариях: whitequark до некоторой степени опровергает одну из моих гипотетических причин, почему ответ может быть «нет». Его аргументы заслуживают внимания, но, конечно, не являются доказательством того, что ответ - «да»).