1

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

使用 ActionScript 3,我设置了一个for循环以向后遍历 a 的元素Vector

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

当我运行它时,它会2, 1, 0按预期输出,但随后会继续4294967295并从那里开始倒计时,直到循环超时并抛出Error #1502.

解决方法是简单地输入aasint而不是uint,但我不明白为什么。当然,我正在处理 0 或更大的值,所以uint正确的数据类型对吗?

我想这4294967295是最大值,uint但我的计数如何到达那里?

如果你这样做

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

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

很抱歉这个有点漫不经心的问题,并为任何帮助而欢呼。

4

3 回答 3

4

你很亲密。正如您所说,您的循环为您提供 2、1、0、4294967295。这是因为 uint 不能为负数。您的循环将始终运行 whilea >= 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),则可以使用循环。

于 2013-09-04T10:15:02.353 回答
3

当 a 为 0 时,将发生迭代和 a--,因此由于您的 int 未签名,因此将设置此类型的最大值 -> 这是在无符号类型中设置负值的方式。

将您的代码更改为:

var limit:uint = myVector.length-1;
for(var a:uint = limit; a > 0; a--)
{
    trace(a);
}
于 2013-09-04T10:04:42.753 回答
1

在二进制中 - 数字的第一个 BIT 是负数,即 int 值。在 UINT 值中,这只是一个 BIT 值。一字节 int 看起来像 1000 0000 == -127 和 0111 1111 = 127 一字节 uint 看起来像 1000 0000 == 128 和 0111 1111 = 128

就是这个。

于 2013-09-05T06:22:47.563 回答