В режиме выпуска поведение кода не такое, как ожидалось

Следующий код генерирует разные результаты в режиме отладки и в режиме выпуска (с использованием Visual Studio 2008):

int _tmain(int argc, _TCHAR* argv[])
{

    for( int i = 0; i < 17; i++ ) 
    { 
        int result = i * 16;

        if( result > 255 )
        {
            result = 255;
        }

        printf("i:%2d, result = %3d\n", i, result) ; 
    } 

    return 0;
}

Вывод режима отладки, который, как и ожидалось:

i: 0, result =   0
i: 1, result =  16
(...)
i:14, result = 224
i:15, result = 240
i:16, result = 255

Вывод режима деблокирования, где результат i: 15 неверен:

i: 0, result =   0
i: 1, result =  16
(...)
i:14, result = 224
i:15, result = 255
i:16, result = 255

Выбрав «Оптимизация -> Не оптимизировать» в Visual Studio в режиме выпуска, вы получите правильный результат. Однако я хотел бы знать, почему процесс оптимизации может привести к ошибочному выводу.

Обновить:

По предложению Мохита Джайнбай, печатает:

printf("i:%2d, result = %3d, i*16=%d\n", i, result, i*16) ;

Вывод режима разблокировки правильный:

i: 0, result =   0, i*16=0
i: 1, result =  16, i*16=16
(...)
i:14, result = 224, i*16=224
i:15, result = 240, i*16=240
i:16, result = 255, i*16=256

Ответы на вопрос(2)

Ваш ответ на вопрос