संभव डुप्लिकेट:
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
है। क्या कोई इस व्यवहार को समझा सकता है?
http://catb.org/jargon/html/N/nasal-demons.html –