Цитата(espectro @ Jul 21 2009, 16:54)

Мдаааа. Чувстую себя дурак - дураком, после АВР в моем мозгу прочно засело вредное заблуждение, что unsigned int всегда имеет размерность 2 байта (((. Только что проверил с помощью нехитрого кода что заблуждался..
Размерность стандартных типов (char, int, long и т.п.) вовсе не гарантируется стандартом языка Си. Стандартом гарантируется лишь, что sizeof(char) ≤ sizeof(short int) ≤ sizeof(int) ≤ sizeof(long int). А конкретная размерность этих типов определяется архитектурой МК и/или компилятором.
По поводу вашего примера в начале топика, быстрее всего (компилятор его оптимизирует для этого) будет выполняться цикл вида
Код
#define VALUE 100
for (unsigned int i = VALUE; i != 0; i--)
{
/* code */
}
Во-первых, используется "естественный" для архитектуры тип локальной переменной. Во-вторых, загрузка значения константы происходит только один раз в начале цикла. В-третьих, в процессе выполнения цикла это значение будет декрементироваться и сравниваться с нулем, а не со значением константы, что (сравнение с нулем) в подавляющем большинстве случаев опять же более "естественно" для системы команд любого МК.
Правда этот способ
не применим в случае, если значение переменной i используется внутри цикла для, например, индексации линейно
возрастающего массива.