【问题标题】:Why does uint break my for loop?为什么 uint 会破坏我的 for 循环?
【发布时间】:2013-09-04 10:01:09
【问题描述】:

这不是一个真正的问题,因为修复很简单而且成本很低。我猜这是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

抱歉这个有点漫不经心的问题,欢迎任何帮助。

【问题讨论】:

    标签: actionscript-3 flash


    【解决方案1】:

    你很接近。正如您所说,您的循环为您提供 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 或者如果您不需要索引 (a),您可以使用 for each(var x:Type in myVector) 循环。

    【讨论】:

    • 你是对的。 myUint-1 确实输入为 int。现在你提到它,这实际上很有意义。输出是使用某种类型的数据计算的结果,但该类型与输出的类型无关。
    • 感谢您回来确认我的想法。我已经更新了我的答案,以为您的循环提供可能的解决方案。
    【解决方案2】:

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

    将您的代码更改为:

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

    【讨论】:

    • a0 时应该发生迭代是有道理的,但它不会产生输出,因为结果是-1,我想这是整个问题的根源,但使用@ 987654324@ 而不是 >= 仅输出 2, 1 并忽略索引 0 处的元素。
    【解决方案3】:

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

    就是这样。

    【讨论】:

      猜你喜欢
      • 2012-05-20
      • 1970-01-01
      • 2020-10-04
      • 2021-03-14
      • 2014-11-25
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多