मैं व्यवहार देख रहा हूं, मुझे इस कोड को जीसीसी में विभिन्न अनुकूलन स्तरों के साथ संकलित करते समय अपेक्षा नहीं है।जीसीसी बदलते सी प्रोग्राम व्यवहार में अनुकूलन स्तर
फ़ंक्शन टेस्ट को 64 बिट हस्ताक्षरित पूर्णांक को लोगों के साथ भरना चाहिए, उन्हें shift_size बिट्स को बाईं ओर स्थानांतरित करें, और 32 बिट बिट्स को 32 बिट हस्ताक्षरित पूर्णांक के रूप में वापस करें।
जब मैं -00 के साथ संकलित करता हूं तो मुझे परिणाम मिलने की उम्मीद होती है।
जब मैं -O2 के साथ संकलित करता हूं, तो मैं 32 बिट्स या उससे अधिक तक स्थानांतरित करने का प्रयास नहीं करता हूं।
असल में, मुझे वास्तव में परिणाम मिलते हैं, यदि मैं x86 पर बिट चौड़ाई से अधिक या बराबर शिफ्ट द्वारा 32 बिट पूर्णांक स्थानांतरित कर रहा था, जो शिफ्ट आकार के केवल 5 कम बिट्स का उपयोग करके एक शिफ्ट है ।
लेकिन मैं 64 बिट नंबर स्थानांतरित कर रहा हूं, इसलिए < 64 को स्थानांतरित करना कानूनी अधिकार होना चाहिए?
मुझे लगता है कि यह मेरी समझ में एक बग है और संकलक में नहीं, लेकिन मैं इसे समझने में सक्षम नहीं हूं।
मेरे मशीन: जीसीसी (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5 i686-linux-gnu
#include <stdint.h>
#include <stdio.h>
#include <inttypes.h>
uint32_t test(unsigned int shift_size) {
uint64_t res = 0;
res = ~res;
res = res << shift_size; //Shift size < uint64_t width so this should work
return res; //Implicit cast to uint32_t
}
int main(int argc, char *argv[])
{
int dst;
sscanf(argv[1], "%d", &dst); //Get arg from outside so optimizer doesn't eat everything
printf("%" PRIu32 "l\n", test(dst));
return 0;
}
उपयोग:
$ gcc -Wall -O0 test.c
$ ./a.out 32
0l
$ gcc -Wall -O2 test.c
$ ./a.out 32
4294967295l
क्या आप अपने कंपाइलर द्वारा जेनरेट किए गए असेंबली कोड के प्रासंगिक हिस्सों को भी पोस्ट कर सकते हैं? (जीसीसी के लिए '-S') –
एफडब्ल्यूआईडब्ल्यू यह जीसीसी 4.2.1 का उपयोग करके' -O0' से '-O3' के सभी अनुकूलन स्तरों पर मेरे लिए सही परिणाम (' 0l') देता है, इसलिए मुझे संदेह है कि आपके पास * हो सकता है * एक जीसीसी बग मिला। –
एचएम, कोड मेरे लिए अनुकूलन स्तर दोनों में ठीक काम करता है ... (जीसीसी संस्करण 4.5.0 20100604, ओपनएसयूएसई 11.3 (x86_64)) – Bort