আমি এই ছোট্ট রত্নটির পিছনে লুকিয়ে থাকা একটি অত্যন্ত বাজে বাগটিকে সন্ধান করেছি। আমি সচেতন যে প্রতি সি ++ স্পেস অনুযায়ী, স্বাক্ষরিত ওভারফ্লোগুলি পূর্বনির্ধারিত আচরণ, তবে কেবল তখনই যখন ওভারফ্লো ঘটে যখন মানটি বিট-প্রস্থে প্রসারিত হয় 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()
রূপান্তর কীভাবে হয়?