#include <stdio.h>
#include <limits.h>
void sanity_check(int x)
{
if (x < 0)
{
x = -x;
}
if (x == INT_MIN)
{
printf("%d == %d\n", x, INT_MIN);
}
else
{
printf("%d != %d\n", x, INT_MIN);
}
if (x < 0)
{
printf("negative number: %d\n", x);
}
else
{
printf("positive number: %d\n", x);
}
}
int main(void)
{
sanity_check(42);
sanity_check(-97);
sanity_check(INT_MIN);
return 0;
}
Cuando puedo compilar el programa anterior con gcc wtf.c
, consigo el resultado esperado:comportamiento extraño número entero con gcc -O2
42 != -2147483648
positive number: 42
97 != -2147483648
positive number: 97
-2147483648 == -2147483648
negative number: -2147483648
Sin embargo, cuando compilo el programa con gcc -O2 wtf.c
, me sale una salida diferente :
42 != -2147483648
positive number: 42
97 != -2147483648
positive number: 97
-2147483648 != -2147483648
positive number: -2147483648
Tenga en cuenta las dos últimas líneas. ¿Qué demonios está pasando aquí? ¿Gcc 4.6.3 se está optimizando demasiado?
(también probado esto con g ++ 4.6.3, y pude observar el mismo comportamiento extraño, por lo tanto, la etiqueta de C++.)
No se siente cómodo para dar consejos para desarrolladores posiblemente más experimentados, pero de todos modos podría ser útil para no tener tanta experiencia. Si veo diferencias "extrañas" causadas solo por el nivel de optimización, lo primero que buscaré es UB. – ThomasMore