2013-05-17 16 views
7

क्या सी और सी ++ गारंटी देता है कि किसी प्रकार के हस्ताक्षरित समकक्ष का आकार समान है?क्या हस्ताक्षरित कीवर्ड आकार के परिणाम को प्रभावित करता है?

उदाहरण:

size_t size = sizeof(unsigned int); 

unsigned पूरी तरह से विवादास्पद यहाँ है?

+3

हालांकि यह अनावश्यक है, मुझे लगता है कि यह 'आकार (हस्ताक्षरित int)' का उपयोग करने की अनुशंसा की जाती है, यदि यह भ्रम से बचने के लिए 'हस्ताक्षरित int' के लिए स्थान के बारे में है। – zch

+2

मनोविज्ञान के मामले में - आप एक्स का आकार चाहते हैं (जो भी एक्स है) - तो बस स्पष्ट रहें।फिर प्रोग्रामिंग आप जो भी एक्स हो, वह हमेशा सही रहेगा - (हस्ताक्षरित int, कक्षा गोभी ...) –

+0

मुझे आश्चर्य होगा अगर आकार (int) कभी आकार के बराबर नहीं है (हस्ताक्षरित)। मैं विश्वास-लेकिन-सत्यापित करने की सलाह देता हूं। – matthudson

उत्तर

14

दोनों भाषाओं की गारंटी है कि एक समान मानक पूर्णांक प्रकार के हस्ताक्षरित और हस्ताक्षरित रूपों का एक ही आकार है।

सी ++, समिति मसौदा n3337, 3.9.1/3:

मानक पर हस्ताक्षर किए पूर्णांक प्रकार से प्रत्येक के लिए 3, वहां मौजूद एक इसी (लेकिन अलग) मानक संयुक्त राष्ट्र पर हस्ताक्षर किए पूर्णांक प्रकार: "अहस्ताक्षरित char "," unsigned int int "," unsigned int int ", 0 uns35 long64", और "हस्ताक्षर किए गए लंबे लंबे int", जिनमें से प्रत्येक भंडारण पर समान मात्रा में रहता है और उसी संरेखण आवश्यकताओं (3.11) है संबंधित हस्ताक्षर पूर्णांक टाइप 45 के रूप में; यानी, प्रत्येक हस्ताक्षरित पूर्णांक प्रकार में समान ऑब्जेक्ट प्रस्तुति इसके संबंधित हस्ताक्षरित पूर्णांक प्रकार के रूप में है। [...]

सी के लिए, शब्दों बहुत समान

मसौदा n1570 से लिया, है 6.2.5/6:

पर हस्ताक्षर किए पूर्णांक प्रकारों में से प्रत्येक के लिए, वहाँ है एक संबंधित (लेकिन अलग) हस्ताक्षरित पूर्णांक प्रकार (बिना हस्ताक्षर किए गए कीवर्ड के साथ नामित) जो संग्रहण (साइन जानकारी समेत) की समान राशि का उपयोग करता है और उसी संरेखण आवश्यकताएं हैं। प्रकार _Bool और मानक हस्ताक्षरित पूर्णांक प्रकारों के अनुरूप हस्ताक्षरित पूर्णांक प्रकार मानक हस्ताक्षरित पूर्णांक प्रकार हैं। हस्ताक्षर किए गए पूर्णांक प्रकार विस्तारित हस्ताक्षरित पूर्णांक प्रकारों के अनुरूप विस्तारित हस्ताक्षरित पूर्णांक प्रकार हैं। मानक और विस्तारित हस्ताक्षरित पूर्णांक प्रकार सामूहिक रूप से हस्ताक्षरित पूर्णांक प्रकार कहा जाता है।

+0

उत्कृष्ट उत्तर, वास्तविक उद्धरण देखने के लिए अच्छा है। –

+0

ओपी आपके उत्तर में प्रारंभिक "हां" भ्रमित है क्योंकि ओपी ने सवाल विषय और प्रश्न शरीर की पहली पंक्ति को उल्टा में बताया है। :-) –

+0

मैं सहमत हूं @ आर। अब बेहतर है? – jrok

2

यह वास्तव में अप्रचलित नहीं है, अधिक अनावश्यक की तरह। मानक एक ही आकार के लिए एक प्रकार के हस्ताक्षरित और हस्ताक्षरित विविधता की गारंटी देता है।

0

तुम हमेशा इस

{ 
char s1[1 + sizeof(int) - sizeof(unsigned int)]; 
char s2[1 + sizeof(unsigned int) - sizeof(int)]; 
} 

जैसे कुछ कोड में डाल सकता है (शायद केवल डिबग में बनाता है)

यह आपको एक संकलन समय विफलता दे देंगे अगर वे कभी विभिन्न आकारों थे।

मैं इसे कभी-कभी अत्यधिक (टाइपिफ़) एड कोड के लिए करता हूं जिसे मैं दोबारा कर रहा हूं।

लेकिन हस्ताक्षरित और हस्ताक्षरित किस्म हमेशा एक ही आकार के होते हैं।

+0

'जोर दें (आकार (हस्ताक्षरित int) == आकार (हस्ताक्षरित int))' अधिक पढ़ने योग्यता के साथ इसे पूरा करता है। –

+0

लेकिन क्या यह रन-टाइम विफलता नहीं है? मैं संकलन ब्लॉक करना चाहता हूँ! – Bathsheba

+0

सी ++ 11 के लिए आप ['std :: static_assert (sizeof (हस्ताक्षरित int) == आकार (हस्ताक्षरित int)," आकार मिलान ") का उपयोग कर सकते हैं; '] (http://en.cppreference.com/w/ सीपीपी/भाषा/static_assert) संकलन समय त्रुटि प्राप्त करने के लिए। –

संबंधित मुद्दे