En el modo de lanzamiento, el comportamiento del código no es el esperado

El siguiente código genera resultados diferentes en el modo de depuración y en el modo de lanzamiento (con 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;
}

La salida del modo de depuración, que es como se esperaba:

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

La salida del modo de liberación, donde i: 15 resultado no es correcto:

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

Al elegir "Optimización -> No optimizar" en Visual Studio en modo de lanzamiento, el resultado de salida será correcto. Sin embargo, me gustaría saber por qué el proceso de optimización podría conducir a resultados erróneos.

Actualizar:

Como lo sugiere Mohit JainBy, impresiones de:

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

La salida del modo de liberación es correcta:

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta