2013-10-13 10 views
6

जैसा कि पहले से ही in the docs पर चर्चा की गई है, bool डेटा प्रकार कम से कम एक बाइट मेमोरी पर कब्जा कर लेता है। ऐसा ही एक सवाल तो इससे पहले कि (How a bool type variable is stored in memory? (C++)) पर कहा गया था, लेकिन इस चर्चा और प्रलेखन केवल एक बूलियन डेटा प्रकार के कब्जे में स्थान की मात्रा के बारे में बात करने लगते हैं, नहीं वास्तव में स्मृति में होता है क्या जब मैं इस कार्य करें:स्मृति में एक बूल का प्रतिनिधित्व कैसे किया जाता है?

bool b = true;

तो वास्तव में स्मृति में क्या होता है? 7 बिट्स का क्या होता है जिनका उपयोग इस जानकारी को संग्रहीत करने में नहीं किया जाता है? क्या मानक इसके लिए व्यवहार निर्धारित करता है?

क्या वे अपरिभाषित हैं? या सी ++ मुख्यालय में किसी ने ऐसा किया है:

enum bool : char 
{ 
    false = 0, 
    true = 1 
}; 
+0

की [कैसे एक bool प्रकार चर स्मृति में संग्रहीत किया जाता है संभव डुप्लिकेट? (सी ++)] (http://stackoverflow.com/questions/7967924/how-a-bool-type-variable-is-stored-in-memory-c) –

+8

[ओटी] "सी ++ मुख्यालय" की धारणा ने मुझे बनाया हसना; यह मुझे चारों ओर मानक की धूलदार प्रतियों और सैकड़ों भाषा वकीलों एसटीएल बनाम stdlib और इसी तरह के diatribes पर पूछताछ के साथ एक ग्रे जगह के रूप में हमला करता है। [/ ओटी] –

+1

@ डैनियलए। मैं उस लेख से जुड़ा हुआ है और यह इस सवाल को संबोधित नहीं करता है । मुझे याद है कि स्मृति में क्या होता है, यह नहीं कि यह कितनी जगह पर है और किस प्लेटफ़ॉर्म पर है। – arman

उत्तर

9

स्टैंडर्ड कहा गया है कि bool मूल्यों के रूप में अभिन्न प्रकार से व्यवहार करते हैं, फिर भी यह स्मृति में उनके ठोस प्रतिनिधित्व निर्दिष्ट नहीं करता:

"प्रकार bool की उपयोगिता को या तो true या false हैं जैसे नीचे बताया गया, bool मूल्यों के रूप में व्यवहार करते हैं। अभिन्न प्रकार के। प्रकार bool के मान अभिन्न पदोन्नति में भाग लेने के " ~ सी ++ 03 3.9.1 §6

" अभिन्न प्रकार के लिए एक पर्याय पूर्णांक है प्रकार। अभिन्न प्रकार का निरूपण फिर भी एक शुद्ध द्विआधारी संख्यान सिस्टम " ~ सी ++ 03 3.9.1 §7

के उपयोग के द्वारा मान निर्धारित करेगा यह bool से int का अभिन्न अंग पदोन्नति परिभाषित करता है:

"bool प्रकार का एक रावल int के प्रकार के रूप में परिवर्तित किया जा सकता है, false शून्य और true बनने के साथ। ये रूपांतरण "bool करने के लिए ~ सी ++ 03 4.5 §4-5

अन्य प्रकार से

के साथ-साथ रूपांतरण:

" अभिन्न पदोन्नति कहा जाता है। एक शून्य मान, नल पॉइंटर मूल्य , या शून्य सदस्य सूचक मान को false में परिवर्तित कर दिया गया है; कोई अन्य मान true में परिवर्तित हो गया है। " ~ सी ++ 03 4।12 §1

+0

सी ++ 14 निर्दिष्ट करता है कि 'बूल' * एक अभिन्न प्रकार है और शुद्ध बाइनरी संख्या प्रणाली का उपयोग करता है, हालांकि यह अभी भी बिल्कुल नहीं कहता है कि इसका क्या अर्थ है। हम उम्मीद कर सकते हैं कि 'झूठी' के पास '0' के समान प्रतिनिधित्व होना चाहिए, और 'सत्य'' 1' का प्रतिनिधित्व करने के लिए है लेकिन यह वास्तव में यह नहीं कहता है। –

4

मानक बूल के द्विआधारी प्रतिनिधित्व के लिए कुछ भी जरूरी नहीं है; यह सिर्फ का कहना है कि, जब अन्य अभिन्न प्रकार को बदलने, एक true bool 1 हो जाएगा और एक false bool 0.

बन जाएगा निश्चित रूप से यह एक कार्यान्वयन एक आपने कहा, जहां इस तरह के रूपांतरण बन जाएगा करने के लिए भावना में समान पता चलता है अनिवार्य रूप से नो-ऑप्स या सादा पूर्णांक चौड़ा होना (लेकिन याद रखें कि bool को एक प्राचीन प्रकार होने के लिए अनिवार्य है, न कि गणना प्रकार)।

-1

मैंने कुछ महीनों से सी ++ में प्रोग्राम नहीं किया था लेकिन AFAIR नियम निम्न है: 0 - झूठा; 0 से भिन्न कोई भी मान - सत्य; (डिफ़ॉल्ट रूप से यह 1 है लेकिन AFAIR यदि आप इसे अन्य पूर्णांक मान से परिवर्तित करते हैं, तो पूर्व 2 को भी सत्य माना जाएगा)।

इस प्रकार आप कह सकते हैं कि सी ++ किसी तरह से अपशिष्ट मेमोरी (अन्य भी) में है क्योंकि यह केवल एक बिट का उपयोग कर सकता है लेकिन संकलक बनाने के लिए यह आसान है।

सी ++ में आप थोड़ा फ़ील्ड (bit fields in wikipedia) भी परिभाषित कर सकते हैं लेकिन इसका अक्सर उपयोग नहीं किया जाता है।

+0

सावधान - एक बंडल प्रकार के स्टोर क्या हैं और सशर्त निर्देश के लिए 'सत्य' की धारणा क्या है ... –

1

आप स्मृति की प्रतिलिपि बनाकर इस तरह की चीजों का परीक्षण कर सकते हैं, यह किस प्रकार से अनदेखा कर रहा है। यह प्रोग्राम test_bool के कच्चे मेमोरी मान को पढ़ता है और इसे test_int में डालता है ताकि आप इसे प्रिंट कर सकें।

int test_int = 0; 
bool test_bool; 

test_bool = true; 
memcpy (&test_int, &test_bool, sizeof(bool)); 
printf ("True value is: %d\n", test_int); 

test_bool = false; 
memcpy (&test_int, &test_bool, sizeof(bool)); 
printf ("False value is: %d\n", test_int); 

मेरे लिए, यह कार्यक्रम देता है:

True value is: 1 
False value is: 0 
+0

'बूल' को' char' (या बेहतर, एक 'char [sizeof (bool)]'), अन्यथा इस आधे ओवरराइट किए गए 'int' की व्याख्या अन्य मुद्दों से जटिल हो सकती है (एक 32-बिट बड़ी-एंडियन मशीन पर' सत्य 'के साथ एकल-बाइट के रूप में संग्रहीत 1, उदाहरण के लिए, आपका कोड 16777216 आउटपुट करेगा)। –

+0

हां, शायद बूल के समान आकार के एक प्रकार का उपयोग करना सबसे अच्छा है। – Atle

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

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