मैं C ++ में फ़ंक्शन ओवरलोडिंग के बारे में सीख रहा हूं और इस पर आया हूं:
void display(int a)
{
cout << "int" << endl;
}
void display(unsigned a)
{
cout << "unsigned" << endl;
}
int main()
{
int i = -2147483648;
cout << i << endl; //will display -2147483648
display(-2147483648);
}
मुझे जो समझ में आया है, int
रेंज में दी गई कोई भी वैल्यू (मेरे मामले int
में 4 बाइट) कॉल करेगी display(int)
और इस रेंज के बाहर का कोई भी मूल्य अस्पष्ट होगा (चूंकि कंपाइलर यह तय नहीं कर सकता कि किस फंक्शन को कॉल करना है)। यह int
अपने न्यूनतम मान यानी -2147483648
जहां संकलन त्रुटि के साथ विफल रहता है को छोड़कर मूल्यों की पूरी श्रृंखला के लिए मान्य है
अतिभारित की कॉल
display(long int)
अस्पष्ट है
लेकिन एक ही मूल्य को एक में ले जाना int
और मूल्य को प्रिंट करना देता है 2147483648
। मैं सचमुच इस व्यवहार से भ्रमित हूँ।
यह व्यवहार केवल तभी क्यों मनाया जाता है जब सबसे नकारात्मक संख्या पारित हो जाती है? (व्यवहार एक ही है अगर किसी के short
साथ प्रयोग किया जाता है -32768
- वास्तव में, किसी भी मामले में जहां नकारात्मक संख्या और सकारात्मक संख्या में एक ही द्विआधारी प्रतिनिधित्व है)
संकलक का इस्तेमाल किया: g ++ (GCC) 4.8.5
call of overloaded ‘display(long int)’ is ambiguous
।
typeof(-2147483648) != int
:। शाब्दिक है 2147483648
, जो एक के लिए बहुत बड़ा है int
, इसलिए यह एक है long
, और इसे नकारा जा रहा है
int j{-2147483648};
एक संकीर्ण रूपांतरण है। अपने आप में लगभग एक सवाल के लायक है, कि। यह संभवतः अनुमति देने से संबंधित है (उदाहरण के लिए) long long
कॉन्स्ट्रेक्स मान जैसे कि 2147483647LL
आरंभीकरण में संकुचित होना।