2010-04-18 9 views
6

में परिवर्तन को परिभाषित करता है मेरे पास मेरे कोड में #define है। अब एक अजीब समस्या क्रिप्ट हो गई है।सी का मान अनपेक्षित रूप से

मैं इस है:

#define _ImmSign 010100 

जाहिर है (मैं एक द्विआधारी संख्या अनुकरण करने के लिए कोशिश कर रहा हूँ), मैं नंबर 10100. बनने के लिए उम्मीद लेकिन जब मैं नंबर का उपयोग इसे में बदल गया है 4160.

यहां क्या हो रहा है? और मैं इसे कैसे रोकूं?

अतिरिक्त

ठीक है, तो यह एक अष्टाधारी के रूप में इस व्याख्या भाषा की वजह से है। क्या कुछ स्मार्ट तरीका है कि भाषा को संख्याओं को पूर्णांक के रूप में समझने के लिए मजबूर करना है? एक अग्रणी 0 अष्टाधारी परिभाषित करता है, और 0x अब मैं इसके बारे में लगता है कि हेक्साडेसिमल को परिभाषित करता है ...

+3

010100 अष्टाधारी में है 0 * 1 + 0 * 8 + 1 * 64 + 0 * 512 + 1 * 4096 = 64 + 4096 = 4160. –

+0

http://www.boost.org/doc/libs/1_42_0/libs/utility/utility.htm#BOOST_BINARY यह आपके लिए उपयोगी हो सकता है। हालांकि सी ++, मुझे लगता है कि यह प्रीप्रोसेसर केवल – Anycorn

+0

@aaa thx सुझाव के लिए है, लेकिन मुझे नहीं लगता कि मुझे किसी तृतीय पक्ष लाइब्रेरी का उपयोग करने की अनुमति है। – NomeN

उत्तर

1

आप गैर पोर्टेबल कोड लिखने और जीसीसी उपयोग करने के लिए तैयार हैं, तो आप उपयोग कर सकते binary constants extension:

#define _ImmSign 0b010100 
+1

argh ... मैंने इस बार कई बार खोज की है लेकिन यह Google में कभी नहीं आई है। तो चट्टानों! – NomeN

13

पूर्णांक एक 0 के साथ शुरू शाब्दिक एक ही तरीका है कि पूर्णांक 0x के साथ शुरू शाब्दिक व्याख्या कर रहे हैं में अष्टाधारी के रूप में व्याख्या कर रहे हैं, दशमलव में नहीं, तो हेक्साडेसिमल के रूप में।

अग्रणी शून्य निकालें और आपको जाने के लिए अच्छा होना चाहिए।

ध्यान दें कि अंडरस्कोर से शुरू होने वाले पहचानकर्ता पूंजी पत्र या अन्य अंडरस्कोर के बाद कार्यान्वयन के लिए आरक्षित हैं, इसलिए आपको उन्हें अपने कोड में परिभाषित नहीं करना चाहिए।

+0

त्वरित उत्तर! क्या इसे रोकने का दूसरा तरीका है और फिर अग्रणी शून्य को हटा रहा है? – NomeN

+2

@ नोमएन: नहीं; यह भाषा का एक मौलिक हिस्सा है। –

4

0 के साथ एक पूर्णांक उपसर्ग करना इसे दशमलव के बजाय एक ऑक्टल संख्या बनाता है, और 010100 ऑक्टल में दशमलव में 4160 है।

+0

एक और त्वरित उत्तर, thx! क्या अग्रणी 0 के को हटाने के चरण में इसे ठीक करने का कोई और तरीका है? – NomeN

+0

ऐसा नहीं है कि मुझे पता है। – Maulrus

2

सी में कोई बाइनरी संख्या वाक्यविन्यास नहीं है, कम से कम कुछ कंपाइलर एक्सटेंशन के बिना। क्या आप देख 010,100 एक अष्टाधारी (आधार 8) संख्या के रूप में व्याख्या है: यह कि एक आंकिक शाब्दिक साथ 0.

2

010100 प्रमुख 0. ऑक्टल 10100 की वजह से सी द्वारा अष्टाधारी के रूप में व्यवहार किया जाता है शुरू होता है 4160.

है किया जाता है
0

ऑक्टल :-) है

आप these macros helpful को 1 या 0 के रूप में दशमलव या ऑक्टल संख्याओं के साथ द्विआधारी संख्याओं का प्रतिनिधित्व करने के लिए पा सकते हैं। वे अग्रणी शून्य को संभालते हैं, लेकिन दुर्भाग्य से आपको सही मैक्रो नाम चुनना है कि आपके पास एक प्रमुख शून्य है या नहीं। सही नहीं है, लेकिन उम्मीद है कि सहायक।

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