6

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

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

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

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

有什么建议么?

4

5 回答 5

17

使用do...while循环

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

这里有一个关于顶部与底部测试循环的有趣讨论。

于 2008-10-23T19:27:46.903 回答
5

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

ushort i = 0;
do {
   ...
} while (++i != 0);
于 2008-10-23T19:47:43.430 回答
4

您可以简单地将 for 替换为 do-while 循环。

ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);
于 2008-10-23T19:28:10.007 回答
1

一定要短吗?为什么不只是

for(int i = 0;i<=0xFFFF;i++)
{
  //do whatever
}
于 2008-10-23T20:02:28.597 回答
1

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

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

ps. Using 16 bit variables on modern machines is actually less efficient than using 32 bit variables as no overflow code needs to be generated.

于 2008-10-23T20:20:43.443 回答