Переполнение целых чисел ActionScript 3.0?

#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 вы используете?, создавали ли вы приложение ранее с другой / более старой версией?