#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;
}
जब मैं gcc wtf.c
साथ उपरोक्त कार्यक्रम संकलन, मैं उम्मीद आउटपुट प्राप्त:जीसीसी के साथ अजीब पूर्णांक व्यवहार -O2
42 != -2147483648
positive number: 42
97 != -2147483648
positive number: 97
-2147483648 == -2147483648
negative number: -2147483648
हालांकि, जब मैं gcc -O2 wtf.c
साथ कार्यक्रम संकलन, मुझे कोई दूसरी आउटपुट प्राप्त :
42 != -2147483648
positive number: 42
97 != -2147483648
positive number: 97
-2147483648 != -2147483648
positive number: -2147483648
अंतिम दो पंक्तियों पर ध्यान दें। पृथ्वी पर क्या चल रहा है? जीसीसी 4.6.3 थोड़ा उत्सुकता से अनुकूलित कर रहा है?
(मैं भी ++ जी के साथ 4.6.3 इस परीक्षण किया है, और मैं एक ही अजीब व्यवहार, इसलिए सी ++ टैग मनाया।)
संभवतः अधिक अनुभवी डेवलपर के लिए सलाह देने में सहज महसूस नहीं करता है, लेकिन फिर भी यह इतना अनुभवी नहीं हो सकता है। अगर मुझे केवल अनुकूलन स्तर के कारण "अजीब" मतभेद दिखाई देते हैं, तो पहली बात यह है कि मैं यूबी की तलाश करूंगा। – ThomasMore