2013-09-04 3 views
1

Это не проблема, так как исправление является простым и довольно безрезультатным. Я предполагаю, что это какое-то свойство for или uint, что я не понимаю, и я просто хотел бы знать, что происходит так ...Почему uint прерывает цикл for?

Использования ActionScript 3 Я создал for цикл для запуска в обратном направлении через элементы Vector.

var limit:uint = myVector.length-1; 
for(var a:uint = limit; a >= 0; a--) 
{ 
    trace(a); 
} 

При запуске этого он выводит 2, 1, 0, как ожидалось, но затем переходит к 4294967295 и начинает обратный отсчет не оттуда до времен цикла, и выдает Error #1502.

Исправить это просто введите a как int, а не uint, но я не понимаю почему. Конечно, я имею дело со значениями 0 и выше, поэтому uint - правильный тип данных?

Я думаю, что 4294967295 является максимальным значением для uint, но как мой счет попадает туда?

Если вы

var myUint:uint = 0; 
trace(myUint - 1); 

Тогда выход -1 так, почему в моем цикле я должен внезапно вернуться назад к 4294967295?

Извините за слегка бессвязный вопрос и приветствуйте любую помощь.

ответ

4

Вы близки. Как вы сказали, ваша петля дает вам 2, 1, 0, 4294967295. Это потому, что uint не может быть отрицательным. Ваш цикл всегда будет работать в то время как a >= 0, и поскольку он никогда не должен прерывать условие цикла, он продолжает цикл навсегда.

var myUint:uint = 0; 
trace(myUint - 1); 

Я не проверял это, но то, что, вероятно, происходит то, что myUint преобразовывается к междунар и затем, 1 вычитают. Следующий код должен подтвердить это.

var myUint:uint = 0; 
trace((myUint - 1) is uint); 
trace((myUint - 1) is int); 

Чтобы исправить контур можно использовать INT или вы могли бы использовать for each(var x:Type in myVector) цикл, если вам не нужен индекс (a).

+0

Вы правы.'myUint-1' действительно введен как' int'. Это действительно имеет смысл, теперь вы упомянули об этом. Результат - результат вычисления с использованием данных определенного типа, но этот тип не влияет на тип вывода. – popClingwrap

+0

Спасибо, что вернулись, чтобы подтвердить мои мысли. Я обновил свой ответ, чтобы предоставить возможное решение для вашего цикла. –

3

Итерация и a-- будут возникать, когда a равно 0, поэтому, поскольку ваш int не подписан, максимальное значение для этого типа будет установлено -> это способ, которым значения минус установлены в неподписанных типах.

Изменить код в:

var limit:uint = myVector.length-1; 
for(var a:uint = limit; a > 0; a--) 
{ 
    trace(a); 
} 
+0

Имеет смысл, что итерация должна произойти, когда 'a' является' 0', но не производит вывод, поскольку результат равен -1, который, я полагаю, является причиной возникновения этой проблемы, но используя '>' вместо '> = 'только выдает' 2, 1' и игнорирует элемент с индексом 0. – popClingwrap

1

В двоичном - первый BIT числа минус, то есть в значениях int. В значении UINT это просто значение BIT. Один байт INT выглядит как 1000 0000 == -127 и 0111 1111 = 127 Один байт UINT выглядит как 1000 0000 == 128 и 0111 1111 = 128

Это он.

Смежные вопросы