इस वेबसाइट पर कई प्रश्न हस्ताक्षर किए गए हैं और हस्ताक्षर किए गए प्रकारों को मिलाते समय और अधिकांश कंपाइलर इस प्रकार की चेतावनियां उत्पन्न करने के बारे में अच्छी नौकरी करते हैं। हालांकि, किसी हस्ताक्षरित प्रकार पर हस्ताक्षरित निरंतर असाइन करते समय जीसीसी की परवाह नहीं होती है!एक हस्ताक्षरित प्रकार के लिए हस्ताक्षरित शाब्दिक असाइन करते समय जीसीसी चेतावनी क्यों नहीं देता है?
/* foo.c */
#include <stdio.h>
int main(void)
{
unsigned int x=20, y=-30;
if (x > y) {
printf("%d > %d\n", x, y);
} else {
printf("%d <= %d\n", x, y);
}
return 0;
}
जीसीसी के साथ संकलन 4.2.1 के रूप में नीचे कंसोल पर कोई उत्पादन का उत्पादन:
$ ./foo
20 <= -30
है:
gcc -Werror -Wall -Wextra -pedantic foo.c -o foo
जिसके परिणामस्वरूप निष्पादन योग्य निम्नलिखित उत्पादन उत्पन्न करता है निम्नलिखित कार्यक्रम पर विचार करें हस्ताक्षर किए गए मान -30
को हस्ताक्षरित पूर्णांक चरपर हस्ताक्षर किए जाने पर GCC कोई चेतावनी या त्रुटि संदेश उत्पन्न नहीं करता है?
ध्यान दें कि आपको 'हस्ताक्षरित int' प्रिंटिंग के लिए% u का उपयोग करना चाहिए। –
@ बास्टियन, वास्तव में; शायद अधिक दिलचस्प बात यह है कि, एंड्रॉइड ने नीचे दिए गए अपने जवाब में बताया, 'printf ("% d")' हस्ताक्षरित मूल्य (42 9 4 9 67266) के बजाय हस्ताक्षरित मूल्य दिखाता है जिसका उपयोग तुलना ऑपरेटर द्वारा किया जाता है! – maerics
यह हस्ताक्षरित int के 2 के पूरक प्रतिनिधित्व के कारण है: http://en.wikipedia.org/wiki/Two%27s_complement (यह प्रतिनिधित्व सी मानक द्वारा गारंटी नहीं है, लेकिन व्यवहार में मैंने कभी एक और प्रतिनिधित्व के बारे में नहीं सुना है अभी भी उपयोग में है) –