C के 2 बाइट्स या 4 बाइट्स में एक इंटेगर वेरिएबल होता है?
यह आपके द्वारा उपयोग किए जा रहे प्लेटफ़ॉर्म पर निर्भर करता है, साथ ही साथ आपके कंपाइलर को कैसे कॉन्फ़िगर किया गया है। एकमात्र आधिकारिक उत्तर sizeof
ऑपरेटर को यह देखने के लिए उपयोग करना है कि आपकी विशिष्ट स्थिति में एक पूर्णांक कितना बड़ा है।
वे कौन से कारक हैं जो इस पर निर्भर करते हैं?
रेंज को आकार के बजाय सबसे अच्छा माना जा सकता है । दोनों व्यवहार में अलग-अलग होंगे, हालांकि यह आकार के अनुसार रेंज प्रकारों को चुनने के लिए बहुत अधिक मूर्ख-सबूत है जैसा कि हम देखेंगे। यह भी ध्यान रखना महत्वपूर्ण है कि मानक हमें आकार के बजाय सीमा के आधार पर हमारे पूर्णांक प्रकारों को चुनने पर विचार करने के लिए प्रोत्साहित करता है , लेकिन अब हम मानक अभ्यास की उपेक्षा करते हैं , और हमारी जिज्ञासा का पता लगाने , बाइट्स और पूर्णांक प्रतिनिधित्व करते हैं ... चलो नीचे फेंक देते हैं खरगोश छेद और इसे अपने लिए देखें ...sizeof
CHAR_BIT
sizeof
बाइट्स और CHAR_BIT
सी मानक (ऊपर से जुड़ा हुआ) से लिया गया निम्न कथन, इस शब्दों में वर्णन करता है कि मुझे नहीं लगता कि इसमें सुधार किया जा सकता है।
sizeof
ऑपरेटर अपनी संकार्य के आकार (बाइट्स में) है, जो एक अभिव्यक्ति या एक प्रकार की parenthesized नाम हो सकता है अर्जित करता है। आकार ऑपरेंड के प्रकार से निर्धारित होता है।
स्पष्ट समझ के अनुसार हमें बाइट्स के बारे में चर्चा करनी होगी । यह आमतौर पर माना जाता है कि एक बाइट आठ बिट्स है, जब वास्तव में CHAR_BIT
आपको बताता है कि एक बाइट में कितने बिट्स हैं । यह उन बारीकियों में से केवल एक है जो आम दो (या चार) बाइट पूर्णांक के बारे में बात करते समय नहीं माना जाता है ।
आइए अब तक चीजों को लपेटें:
sizeof
=> बाइट्स में आकार, और
CHAR_BIT
=> बाइट में बिट्स की संख्या
इस प्रकार, आपके सिस्टम के आधार पर, शून्य से अधिक कोई भी मान sizeof (unsigned int)
हो सकता है (केवल 2 या 4 नहीं), जैसे कि 16 है, तो एक एकल (सोलह-बिट) बाइट में पर्याप्त बिट्स होते हैं जो सोलह बिट पूर्णांक द्वारा वर्णित का प्रतिनिधित्व करते हैं। मानकों (नीचे उद्धृत) यह जरूरी जानकारी नहीं है, यह है? चलो गहरी तल्लीन ...CHAR_BIT
पूर्णांक प्रतिनिधित्व
C मानक यहाँ सभी मानक पूर्णांक प्रकारों (और CHAR_BIT
, भी, fwiw) के लिए न्यूनतम परिशुद्धता / श्रेणी निर्दिष्ट करता है । इस से, हम एक न्यूनतम प्राप्त कर सकते हैं कि मूल्य को संग्रहीत करने के लिए कितने बिट्स की आवश्यकता होती है , लेकिन हम बस श्रेणियों के आधार पर हमारे चर का चयन कर सकते हैं । बहरहाल, इस उत्तर के लिए आवश्यक विवरण का एक बड़ा हिस्सा यहां रहता है। उदाहरण के लिए, मानक unsigned int
को कम से कम सोलह बिट्स भंडारण की आवश्यकता होती है:
UINT_MAX 65535 // 2¹⁶ - 1
इस प्रकार हम देख सकते हैं कि कम से कमunsigned int
( 16) बिट्स की आवश्यकता है , जो कि आपको दो बाइट्स मिलती है (मान लिया गया है CHAR_BIT
कि 8 है) ... और बाद में जब यह सीमा बढ़ गई 2³² - 1
, तो लोग इसके बजाय 4 बाइट्स बता रहे थे। यह आपके द्वारा देखी गई घटनाओं की व्याख्या करता है:
अधिकांश पाठ्यपुस्तकों का कहना है कि पूर्णांक चर 2 बाइट्स हैं। लेकिन जब मैं पूर्णांकों की एक सरणी के क्रमिक पतों को प्रिंट करने वाला कार्यक्रम चलाता हूं तो यह 4 के अंतर को दर्शाता है।
आप एक प्राचीन पाठ्यपुस्तक और संकलक का उपयोग कर रहे हैं जो आपको गैर-पोर्टेबल सी सिखा रहा है; लेखक, जिसने आपकी पाठ्यपुस्तक लिखी हो, को भी इसकी जानकारी नहीं होगी CHAR_BIT
। आपको अपनी पाठ्यपुस्तक (और संकलक) को अपग्रेड करना चाहिए , और यह याद रखने का प्रयास करना चाहिए कि आईटी एक हमेशा विकसित क्षेत्र है जिसे प्रतिस्पर्धा करने के लिए आपको आगे रहने की आवश्यकता है ... इसके बारे में पर्याप्त है, हालांकि; आइए देखते हैं कि अन्य गैर-पोर्टेबल रहस्य उन अंतर्निहित पूर्णांक बाइट्स स्टोर क्या हैं ...
मूल्य बिट्स हैं जो आम गलतफहमी की गिनती के लिए दिखाई देते हैं। उपरोक्त उदाहरण एक unsigned
पूर्णांक प्रकार का उपयोग करता है जिसमें आम तौर पर केवल मूल्य बिट्स होते हैं, इसलिए विस्तार में शैतान को याद करना आसान होता है।
साइन बिट्स ... उपरोक्त उदाहरण में मैंने UINT_MAX
ऊपरी सीमा के रूप में उद्धृत किया unsigned int
क्योंकि यह 16
टिप्पणी से मूल्य निकालने के लिए एक मामूली उदाहरण है । हस्ताक्षरित प्रकारों के लिए, सकारात्मक और नकारात्मक मूल्यों (जो कि संकेत है) के बीच अंतर करने के लिए, हमें साइन बिट को भी शामिल करना होगा।
INT_MIN -32768 // -(2¹⁵)
INT_MAX +32767 // 2¹⁵ - 1
पैडिंग बिट्स ... जबकि पूर्णांक में बिट्स वाले कंप्यूटरों का सामना करना आम नहीं है, तो C मानक ऐसा करने की अनुमति देता है; कुछ मशीनें (यानी यह एक ) दो छोटे (हस्ताक्षरित) पूर्णांक मानों को एक साथ जोड़कर बड़े पूर्णांक प्रकारों को लागू करती हैं ... और जब आप हस्ताक्षर किए गए पूर्णांकों को जोड़ते हैं, तो आपको एक व्यर्थ साइन बिट मिलता है। उस व्यर्थ बिट को सी में पैडिंग माना जाता है। पैडिंग बिट्स के अन्य उदाहरणों में समता बिट्स और ट्रैप बिट्स शामिल हो सकते हैं ।
जैसा कि आप देख सकते हैं, मानक पूर्णांक प्रकारों का चयन करते समय मानक जैसे मानकINT_MIN
.. INT_MAX
और अन्य न्यूनतम / अधिकतम मानों को प्रोत्साहित करने के लिए लगता है , और आकार पर निर्भर होने वाले हतोत्साहित करते हैं क्योंकि अन्य सूक्ष्म कारकों को भूल जाने की संभावना है जैसे कि CHAR_BIT
और पैडिंग बिट्स जो मूल्य को प्रभावित कर सकता है sizeof (int)
(यानी दो-बाइट और चार-बाइट पूर्णांकों की आम गलतफहमी इन विवरणों की उपेक्षा करती है)।