从0x0000循环到0xFFFF

Loop from 0x0000 to 0xFFFF

提问人:Robert Deml 提问时间:10/24/2008 更新时间:10/24/2008 访问量:5345

问:

我想要一个使用 UInt16 (ushort) 循环其所有值的循环。但是,这并不能做到这一点:

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

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

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

有什么建议吗?

C# 循环 for 循环

评论

0赞 warren 10/24/2008
你必须数数吗?
0赞 Ferruccio 10/24/2008
你有同样的问题倒计时

答:

17赞 Chris Marasti-Georg 10/24/2008 #1

使用循环do...while

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

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

评论

0赞 Jeff Yates 10/24/2008
比我的回答好多了。:)
0赞 Ferruccio 10/24/2008
这太棒了,但不知何故令人不安;-)
0赞 warren 10/24/2008
极度令人不安;我正要取下我的 answwer,因为我犯了一个傻瓜,但倒计时也可以,是吗?喜欢 for(ushort i=UInt16.MaxValue; i>=0; i--)
0赞 Chris Marasti-Georg 10/24/2008
不,对不起,沃伦。由于 i 是无符号的,因此它永远不会小于 0。你仍然想要一个...而。
0赞 warren 10/24/2008
这就是为什么我没有说“小于”,我选择了“大于或等于”
4赞 Burkhard 10/24/2008 #2

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

ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);
5赞 spoulson 10/24/2008 #3

UInt16.MaxValue 的计算结果为 0xffff,而不是 .我认为你可以用 / 循环来做到这一点,作为 burkhard1979 答案的变体。0x10000dowhile

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

评论

1赞 Paul Hargreaves 10/24/2008
我更喜欢这个答案。更有趣!
0赞 Artelius 11/10/2008
!= 0 是多余的。但这种方法是我使用的那种东西。整数溢出 ftw!
0赞 spoulson 11/10/2008
真。我有点习惯 C#,它不会像 C/C++ 那样隐式将 int 转换为布尔值。
0赞 Burkhard 4/20/2010
由于它被标记为 C#,我认为如果没有 !=0,它将无法工作
1赞 Kevin 10/24/2008 #4

它必须是空头吗?为什么不只是

for(int i = 0;i<=0xFFFF;i++)
{
  //do whatever
}
1赞 Paul de Vrieze 10/24/2008 #5

假设您的代码出现一个错误(当前代码在计算最终值之前停止。那么以下可能会回答你。

很简单,因为你的计数器是一个 16 位无符号整数,它的值不能大于 ,因为该值仍然有效,你需要有一些超出该值的值作为保护。但是,以 16 位相加只是换行到 。如建议,要么使用 do while 循环(不需要保护值),要么使用更大的值来包含计数器。0xffff10xffff0

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