从0x0000到0xFFFF的循环

本文关键字:循环 0xFFFF 0x0000 | 更新日期: 2023-09-27 17:48:53

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

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

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

我可以将"I"设为int并强制转换它,或者将它赋给循环中的ushort变量。

有什么建议吗?

从0x0000到0xFFFF的循环

使用do...while循环

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

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

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

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

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

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

它必须是短的吗?为什么不只是

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

假设您的代码出现了一个错误(当前代码在评估最终值之前停止)。那么下面可能会回答您的问题。

非常简单,因为您的计数器是一个16位无符号整数,它的值不能大于0xffff,因为该值仍然有效,所以您需要有一些扩展到CCD_7之外的值作为保护。然而,以16位将CCD_ 8添加到CCD_。按照建议,可以使用do-while循环(不需要保护值),也可以使用较大的值来包含计数器。

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