2012-08-06 14 views
5

संभव डुप्लिकेट:
GCC left shift overflowअप्रत्याशित बाएं पारी व्यवहार

निम्नलिखित न्यूनतम कार्यक्रम पर विचार करें।

#include <stdint.h> 
#include <stdio.h> 

int main() 
{ 
    uint32_t v = 1024; 
    v &= (((uint32_t)1 << 32) - 1); 
    printf("v = %u\n", v); 
    return 0; 
} 

यह 1024 प्रिंट के रूप में मैं MinGW के तहत जीसीसी के साथ संकलन अपेक्षित होगा। चूंकि 1 बार 32 बार बाईं ओर स्थानांतरित हो गया है, इसलिए 0-1 = -1 जो ​​"1111 .... 1111" है। यह किसी भी मूल्य के साथ एक ही मूल्य फिर से वापस करना चाहिए।

हालांकि, अगर मैं

#include <stdint.h> 
#include <stdio.h> 

int main() 
{ 
    unsigned int s = 32; 
    uint32_t v = 1024; 
    v &= (((uint32_t)1 << s) - 1); 
    printf("v = %u\n", v); 
    return 0; 
} 

के कार्यक्रम बदलने के परिणाम मुद्रित अब 0 है। क्या कोई इस व्यवहार को समझा सकता है?

उत्तर

7

32 बिट्स द्वारा 32-बिट मान को स्थानांतरित करना सी में अपरिभाषित व्यवहार है। ऐसा न करें।

+0

http://catb.org/jargon/html/N/nasal-demons.html –

6

दोनों अपरिभाषित व्यवहार हैं, क्योंकि शिफ्ट दूरी प्रकार की बिट-चौड़ाई से कम होनी चाहिए। निरंतर के साथ, जीसीसी के अनुकूलक जो आप उम्मीद करते हैं, लेकिन चर के साथ, शिफ्ट रन टाइम पर किया जाता है। शायद शिफ्ट दूरी 31 के साथ मुखौटा है, इसलिए कोई शिफ्ट नहीं किया जाता है और 1 - 1 == 0.

संबंधित मुद्दे