从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变量。
有什么建议吗?
使用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位变量效率低,因为不需要生成溢出代码。