从0x0000循环到0xFFFF

时间:2008-10-23 19:25:18

标签: c# loops for-loop

我想要一个使用UInt16(ushort)循环遍历其所有值的循环。但是,这不会这样做:

for( ushort i = 0; i < UInt16.MaxValue; i++ )
{
    // do something
}

问题是当i == 0xFFFF而不是“做某事”时,循环将退出。 如果我将'for'语句更改为“for(ushort i = 0; i&lt; = UInt16.MaxValue; i ++)”,那么它将变为无限循环,因为我永远不会达到0x10000,因为ushorts只会转到0xFFFF。

我可以将'i'设为int并将其转换为或将其分配给循环中的ushort变量。

有什么建议吗?

5 个答案:

答案 0 :(得分:17)

使用do...while循环

ushort i = 0;
do
{
    // do something
} while(i++ < UInt16.MaxValue);

有一个有趣的讨论在顶部与底部here测试循环。

答案 1 :(得分:5)

UInt16.MaxValue evaluates to 0xffff,而不是0x10000。我认为您可以使用do / while循环执行此操作,作为burkhard1979答案的变体。

ushort i = 0;
do {
   ...
} while (++i != 0);

答案 2 :(得分:4)

你可以简单地用do-while循环代替for。

ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);

答案 3 :(得分:1)

它必须是短吗?为什么不呢

for(int i = 0;i<=0xFFFF;i++)
{
  //do whatever
}

答案 4 :(得分:1)

假设您的代码遭遇一个错误(当前代码,在评估最终值之前停止。那么以下内容可能会回答您。

非常简单,因为你的计数器是16位无符号整数,它的值不能大于0xffff,因为该值仍然有效,你需要有一些超出保护的值。但是,将1添加到16位中的0xffff只会绕回0。如建议的那样,要么使用do while循环(不需要保护值),要么使用更大的值来包含计数器。

PS。在现代机器上使用16位变量实际上比使用32位变量效率低,因为不需要生成溢出代码。