#apache-flex #actionscript-3 #integer #overflow
#apache-flex #actionscript-3 #целое #переполнение
Вопрос:
У меня есть старый файл AIR, который отлично работает. Я попытался перекомпилировать его, но результирующий файл airfile содержит ошибки.
Покопавшись в коде, я обнаружил, что в каком-то месте строки разбираются на целые числа, и что результирующее значение int не соответствует строке. Итак, я создал простой файл Actionscript и выполнил код:
var test:int = parseInt("3710835714");
и переменная будет иметь значение
-584131582
Итак, это похоже на переполнение. Но я удивлен, что имеющийся у меня файл air (который я не компилировал сам) работает просто отлично. Итак, мне интересно — зависит ли внутреннее представление int каким-либо образом от того, какая версия библиотек Flex или AIR sdk используется для компиляции?
// редактировать: похоже, это сводится к этому тесту:
var obj:Object = new Object();
obj.val="3710835714";
var test1:Boolean = (obj.val==-584131582);
var test2:Boolean = (int(obj.val)==-584131582);
для меня это оценивается как
test1=false;
test2=true;
однако — этот старый файл AIR, похоже, оценивает оба случая как true. Как это может быть?
Комментарии:
1. что произойдет, если вы используете uint вместо int?
2. ну, это, конечно, должно сработать, потому что тогда значения идентичны (поскольку 3710835714 вписывается в uint). но вопрос в том, почему мой старый файл AIR оценивает первый тест (без изменений кода) как true? либо внутреннее представление целых чисел больше, либо есть разница в том, как строки и целые числа сравниваются с помощью == ?
3. я предполагаю , что строка преобразуется в uint, а затем сравнение false / true зависит от того, является ли это строгим побитовым сравнением или сравнением фактических значений (я не думаю, что я это хорошо объясняю ..)
Ответ №1:
Это происходит из-за того, что заданное число превышает Int предел ActionsScript
Тип данных int хранится внутри как 32-разрядное целое число и содержит набор целых чисел от -2 147 483 648 (-231) до 2 147 483 647 (231 — 1),
и число 3,710,835,714 превышает его на 1563352067
но ваш результат синтаксического анализа показывает, что компилятор рассматривает его как Uint, максимальный предел которого составляет 4,294,967,295, т. е.
-584131581 = 3,710,835,714 — 4,294,967,295
Вы должны использовать Uint или Number для больших целых чисел
этот блог может помочь вам
Проблема с числовым типом данных ActionScript 3 с длинными целочисленными значениями
Надеюсь, это сработает
Комментарии:
1. это все абсолютно ясно — мой актуальный вопрос заключается в том, почему точно такой же код работал, когда он был скомпилирован ранее?
2. какие версии AIR / FLEX SDK вы используете?, создавали ли вы приложение ранее с другой / более старой версией?