#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;
}
Wenn ich das obige Programm mit gcc wtf.c
kompilieren, erhalte ich die erwartete Ausgabe:seltsame integer Verhalten mit gcc -O2
42 != -2147483648
positive number: 42
97 != -2147483648
positive number: 97
-2147483648 == -2147483648
negative number: -2147483648
Allerdings, wenn ich das Programm mit gcc -O2 wtf.c
kompilieren, erhalte ich einen anderen Ausgang :
42 != -2147483648
positive number: 42
97 != -2147483648
positive number: 97
-2147483648 != -2147483648
positive number: -2147483648
Beachten Sie die letzten beiden Zeilen. Was um alles in der Welt geht hier vor? Verbessert GCC 4.6.3 ein bisschen zu eifrig?
(I getestet dies auch mit g ++ 4.6.3, und ich beobachtete die gleiche seltsame Verhalten, also die C++-Tag.)
nicht wohl fühlen, um Rat für möglicherweise viel erfahrenere Entwickler zu geben, aber auf jeden Fall könnte es nützlich sein für nicht so erfahren. Wenn ich "seltsame" Unterschiede sehe, die nur durch das Optimierungslevel verursacht werden, werde ich zuerst nach UB suchen. – ThomasMore