प्रकार रूपांतरण (Type Conversion)
एक डेटा प्रकार के मान को दूसरे डेटा प्रकार में बदलना। दो प्रकार:
- अप्रत्यक्ष (Implicit) - कंपाइलर स्वतः करता है
- स्पष्ट (Explicit) - प्रोग्रामर कास्ट ऑपरेटर से करता है
1. अप्रत्यक्ष प्रकार रूपांतरण (Implicit Type Conversion)
- कंपाइलर द्वारा स्वतः जब ऑपरेंड्स अलग प्रकार के हों
- छोटा प्रकार → बड़ा प्रकार (प्रकार प्रोमोशन)
- कोई डेटा हानि नहीं (आमतौर पर)
उदाहरण
int i = 10;
float f = 3.14;
double d = 2.71;
double result = i + f + d;
// i → float → double
// f → double
// अंतिम परिणाम double
प्रकार पदानुक्रम (रैंक)
long double (उच्चतम)
↑
double
↑
float
↑
unsigned long long
↑
long long
↑
unsigned long
↑
long
↑
unsigned int
↑
int (डिफ़ॉल्ट प्रोमोशन लक्ष्य)
↑
unsigned short / short
↑
unsigned char / char (निम्नतम)
उदाहरण: अप्रत्यक्ष रूपांतरण
#include <stdio.h>
int main() {
int i = 40;
float a;
a = i; // int → float अप्रत्यक्ष
printf("अप्रत्यक्ष मान: %f\n", a); // 40.000000
return 0;
}
2. स्पष्ट प्रकार रूपांतरण (Explicit Type Conversion / Casting)
- प्रोग्रामर द्वारा
(type)ऑपरेटर से - बड़े प्रकार से छोटे में → डेटा हानि संभव
- रनटाइम जांच नहीं (C में)
सिंटैक्स
(type_name) expression
उदाहरण: स्पष्ट रूपांतरण
#include <stdio.h>
int main() {
int i = 40;
short a;
a = (short)i; // स्पष्ट कास्ट
printf("स्पष्ट मान: %d\n", a); // 40
// डेटा हानि उदाहरण
int big = 100000;
short small = (short)big; // ओवरफ्लो!
printf("बड़ा: %d, छोटा: %d\n", big, small); // 100000, -31072 (implementation-defined)
return 0;
}
उदाहरण: लूप में कास्टिंग
// अप्रत्यक्ष (कंपाइलर करता है)
for (int x = 97; x <= 122; x++)
printf("%c", x); // %c int को char मानता है
// स्पष्ट (प्रोग्रामर करता है)
for (int x = 97; x <= 122; x++)
printf("%c", (char)x); // इरादा स्पष्ट
तुलना
| पहलू | अप्रत्यक्ष | स्पष्ट |
|---|---|---|
| कौन करता है | कंपाइलर | प्रोग्रामर |
| सिंटैक्स | कोई अतिरिक्त नहीं | (type)expr |
| दिशा | छोटा → बड़ा | कोई भी दिशा |
| डेटा हानि | नहीं (आमतौर पर) | संभव |
| पठनीयता | छिपा हुआ | इरादा स्पष्ट |
| चेतावनी | कम | अधिक (यदि संकीर्ण) |
सावधानियाँ
⚠ सामान्य गलतियाँ
- पॉइंटर कास्ट:
(int*)ptr- अलाइनमेंट/सख्त उपनाम उल्लंघन - कॉन्स्ट कास्ट:
(int*)const_ptr- अपरिभाषित व्यवहार यदि मूल const - फंक्शन पॉइंटर: असंगत सिग्नेचर कास्ट करना UB
- फ्लोट → इंट: कटौती (truncation), राउंडिंग नहीं
सर्वोत्तम अभ्यास
- स्पष्ट कास्ट तभी जब आवश्यक हो
- संकीर्ण रूपांतरण (narrowing) से बचें या जांचें
intptr_t/uintptr_tपॉइंटर-इंट कन्वर्जन के लिए- C11
_Genericटाइप-जेनेरिक मैक्रोज़ के लिए