Вопрос
Мне нужен цикл, который использует UInt16 (ushort) для перебора всех своих значений.Однако это не делает этого:
for( ushort i = 0; i < UInt16.MaxValue; i++ )
{
// do something
}
Проблема в том, что цикл завершится, когда i == 0xFFFF, а не «что-то сделает».Если я изменю оператор for на for(ushort i = 0;я <= UInt16.MaxValue;i++ )", тогда это становится бесконечным циклом, потому что я никогда не добираюсь до 0x10000, потому что ushorts переходят только на 0xFFFF.
Я мог бы сделать 'i' целым числом и привести его или присвоить переменной ushort в цикле.
Какие-либо предложения?
Другие советы
UInt16.MaxValue
оценивается как 0xffff
не 0x10000
. Я думаю, что вы можете сделать это с помощью цикла do
/ while
, как вариант ответа burkhard1979.
ushort i = 0;
do {
...
} while (++i != 0);
Вы можете просто заменить for на цикл do-while.
ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);
это должно быть коротким? почему не просто
for(int i = 0;i<=0xFFFF;i++)
{
//do whatever
}
Предположим, что в вашем коде произошла ошибка на одну ошибку (текущий код останавливается непосредственно перед оценкой окончательного значения.Тогда вам может ответить следующее.
Очень просто, поскольку ваш счетчик представляет собой 16-битное целое число без знака, он не может иметь значения, превышающие 0xffff
, поскольку это значение все еще действительно, вам необходимо иметь какое-то значение, выходящее за рамки защитного значения.Однако добавление 1
к 0xffff
в 16 битах просто оборачивается 0
.Как предложено, либо используйте цикл do while (который не требует защитного значения), либо используйте большее значение для хранения счетчика.
пс.Использование 16-битных переменных на современных машинах на самом деле менее эффективно, чем использование 32-битных переменных, поскольку не требуется генерировать код переполнения.