मैंने इस छोटे से मणि के पीछे छिपे एक बेहद गंदे बग को ट्रैक किया। मुझे पता है कि C ++ कल्पना के अनुसार, हस्ताक्षरित ओवरफ्लो अपरिभाषित व्यवहार हैं, लेकिन केवल जब अतिप्रवाह तब होता है जब मूल्य को बिट-चौड़ाई तक बढ़ाया जाता है sizeof(int)
। जैसा कि मैंने इसे समझा है, char
जब तक कभी भी अपरिभाषित व्यवहार नहीं करना चाहिए , वृद्धि नहीं होनी चाहिए sizeof(char) < sizeof(int)
। लेकिन यह नहीं समझाता है कि c
एक असंभव मूल्य कैसे मिल रहा है । 8-बिट पूर्णांक के रूप में, c
इसकी बिट-चौड़ाई से अधिक मान कैसे हो सकता है ?
कोड
// Compiled with gcc-4.7.2
#include <cstdio>
#include <stdint.h>
#include <climits>
int main()
{
int8_t c = 0;
printf("SCHAR_MIN: %i\n", SCHAR_MIN);
printf("SCHAR_MAX: %i\n", SCHAR_MAX);
for (int32_t i = 0; i <= 300; i++)
printf("c: %i\n", c--);
printf("c: %i\n", c);
return 0;
}
उत्पादन
SCHAR_MIN: -128
SCHAR_MAX: 127
c: 0
c: -1
c: -2
c: -3
...
c: -127
c: -128 // <= The next value should still be an 8-bit value.
c: -129 // <= What? That's more than 8 bits!
c: -130 // <= Uh...
c: -131
...
c: -297
c: -298 // <= Getting ridiculous now.
c: -299
c: -300
c: -45 // <= ..........
इसे आइडोन पर देखें।
printf()
रूपांतरण कैसे करता है?