这不是一个真正的问题,因为修复很简单且相当无成本。我猜这是for
或uint
的某些属性,我不明白,我只是想知道发生了什么......
使用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
?
对于稍微漫无边际的问题和欢呼声抱歉。
答案 0 :(得分:4)
你很亲密。如你所说,你的循环给你2,1,0,4294967295.这是因为uint不能是负数。你的循环将始终在a >= 0
运行,并且因为它永远不会-1来打破循环条件,它会继续循环。
var myUint:uint = 0;
trace(myUint - 1);
我没有对此进行测试,但可能发生的事情是myUint被转换为int然后减去1。以下代码应该能够确认这一点。
var myUint:uint = 0;
trace((myUint - 1) is uint);
trace((myUint - 1) is int);
要修复你的循环你可以使用int,或者你可以使用for each(var x:Type in myVector)
循环,如果你不需要索引(a
)。
答案 1 :(得分:3)
迭代和a--将在a为0时发生,因此当你的int未签名时,将设置此类型的最大值 - >这是减号值在无符号类型中设置的方式。
将您的代码更改为:
var limit:uint = myVector.length-1;
for(var a:uint = limit; a > 0; a--)
{
trace(a);
}
答案 2 :(得分:1)
在二进制中 - 数字的第一个BIT是负数,即int值。在UINT值中,它只是值的BIT。 一个字节int看起来像1000 0000 == -127和0111 1111 = 127 一个字节uint看起来像1000 0000 == 128和0111 1111 = 128
就是这样。