2010-07-01 25 views
5

में वाम पैडिंग मैं उस मैक्रो कुछ इस तरह दिखता है:"बिटवाइस और" और सी ++

Foo(x) ((x - '!') & 070) 

अगर मैं निम्नलिखित कोड फोन:

Foo('1') => 16 

हालांकि, अगर मैं फोन निम्नलिखित कोड:

(('1' - '!') & 70) => 0 

तो मेरा सवाल यह है कि, यहां क्या हो रहा है? x & 070x पर गणना क्यों करता है लेकिन x & 70 0 पर गणना करता है?

मेरा अनुमान है कि बाईं ओर अतिरिक्त 0 को 1 के बजाय 2 बाइट लेने के लिए 60 मजबूर कर रहा है। उस स्थिति में, बिटवाई & निम्नानुसार नहीं होगा?

0000 0000 0001 0000  '16 
0000 0000 0100 0110 & '70 
------------------- 
0000 0000 0000 0000 
+0

मुझे इसका उत्तर पता था (0 उपसर्ग = ऑक्टल स्थिर) लेकिन मैं कर सकता हूं ई प्रोग्रामिंग के 20 से अधिक वर्षों में ईमानदारी से कहें, मैंने इसे कभी नहीं देखा है। ऐसा लगता है कि यह उन चीजों में से एक है जो ऐसा प्रतीत होता है जब यह उपयोगी होता, शायद टेलेटाइप मशीनों या जो भी हो, उससे कुछ करना पड़ता है। एक एम्बेडेड लड़के के रूप में, मैं हमेशा उलझन में हूं कि बाइनरी स्थिरांक के लिए 'बी' उपसर्ग की तरह कुछ नहीं है (हाँ, मेरे पास सी और सी ++ में ऐसा करने का अपना तरीका है, यह बहुत खराब है कि यह भाषा में नहीं बनाया गया है)। – Dan

उत्तर

12

सी ++ में, एक अग्रणी 0 साथ एक निरंतर एक अष्टाधारी निरंतर, नहीं एक दशमलव स्थिर है। यह अभी भी एक पूर्णांक स्थिर है लेकिन 070 == 56 है।

यह व्यवहार में अंतर का कारण है।

+0

धन्यवाद, मुझे उम्मीद है कि यह कुछ सरल होगा, लेकिन मुझे एहसास नहीं हुआ कि मैं गलत आधार पर था! – sohum

7

नहीं, अतिरिक्त 0 का मतलब है कि संख्या ऑक्टल (बेस 8) के रूप में पढ़ी जाती है। इसका मतलब है कि यह 70 है, लेकिन 56 नहीं कहता है:

0000 0000 0001 0000  '16 
0000 0000 0011 1000 & '56 
------------------- 
0000 0000 0001 0000 
3

एक 0 आप की तरह कर रहे हैं के साथ 070 prepending संकलक बताता अष्टाधारी के रूप में यह व्याख्या करने के लिए, दशमलव में नहीं। आप शायद 70 कहना चाहते हैं।

3

जैसा कि अन्य ने कहा, 070 एक ऑक्टल (और 0x70 एक हेक्साडेसिमल) निरंतर है, जहां आपकी समस्या निहित है।

मैं जोड़ने के लिए है, हालांकि चाहते हैं, कि आप मैक्रो के बजाय inline कार्यों का उपयोग करना चाहिए:

inline int Foo(int x) { return (x - '!' & 070); } 

सी ++ हमें कई बातों के लिए पूर्वप्रक्रमक से छुटकारा पाने के लिए अनुमति देने के एक बहुत कुछ किया है, क्योंकि यह बुरा, दुर्व्यवहार, और खतरनाक। यदि आप इसके बिना कर सकते हैं, तो ऐसा करें।
(और यदि आप इसका उपयोग करते हैं, तो मैक्रोज़ ऑल-अपरकेस बनाने के लिए बाद में अपने कोड से निपटने वाले लोगों पर दया करें।)

+0

मूल कोड वास्तव में किसी और ने लिखा था। मैं इसे सिर्फ एक अलग भाषा में भेज रहा हूं। – sohum