为什么uint会破坏我的for循环?

时间:2013-09-04 10:01:10

标签: actionscript-3 flash

这不是一个真正的问题,因为修复很简单且相当无成本。我猜这是foruint的某些属性,我不明白,我只是想知道发生了什么......

使用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是正确的数据类型吗?

我想4294967295uint的最大值,但我的计数是如何实现的?

如果你这样做

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

然后输出为-1那么为什么我应该在我的循环中突然跳回到4294967295

对于稍微漫无边际的问题和欢呼声抱歉。

3 个答案:

答案 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

就是这样。