Целочисленное переполнение в ActionScript 3.0? - PullRequest
0 голосов
/ 11 мая 2011

У меня есть старый файл AIR, который отлично работает. Я попытался перекомпилировать его, но полученный файл с ошибками.

После копания в коде я обнаружил, что в некоторых местах строки анализируются в int, и что полученный int не соответствует строке. Поэтому я сделал простой файл Actionscript и выполнил код:

var test:int = parseInt("3710835714");

и переменная будет иметь значение

-584131582

Так что это выглядит как переполнение. Но я удивлен, что файл, который у меня есть (который я сам не компилировал), работает нормально. Поэтому мне интересно - зависит ли внутреннее представление int от того, какую версию библиотек SDK Flex или AIR вы используете для компиляции?

// edit: похоже, все сводится к этому тесту:

        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 оценивает оба случая как истинные. Как это может быть?

1 Ответ

3 голосов
/ 11 мая 2011

Это происходит из-за того, что номер Give превышает ActionsScript Int limit

Тип данных int хранится внутри как 32-разрядное целое число и содержит набор целых чисел от -2 147 483 648 (-231) до 2 147 483 647 (231 - 1),

и число 3,710,835,714 превышает его на 1563352067

но ваш результат разбора показывает, что компилятор рассматривает его как Uint , чей максимальный предел равен 4 294 967 295 т.е. 10 * *

-584131581 = 3 710 835 714 - 4 294 967 295

Вы должны использовать Uint или Число для больших целых чисел / целых чисел

этот блог может вам помочь
ActionScript 3 Ошибка типа данных с длинными целочисленными значениями

Надежды, которые работают

...