2010-09-29 13 views
15

आईएसओ सी मानक हस्ताक्षरित पूर्णांक के लिए तीन एन्कोडिंग विधियों की अनुमति देता है: दो पूरक, एक पूरक और साइन/परिमाण।सी में हस्ताक्षरित पूर्णांक पर एन्कोडिंग का पता लगाने के लिए कैसे?

रनटाइम पर एन्कोडिंग का पता लगाने के लिए एक कुशल या अच्छा तरीका क्या है (या कोई बेहतर समाधान यदि कोई बेहतर समाधान है)? मैं यह जानना चाहता हूं ताकि मैं विभिन्न संभावनाओं के लिए एक बिग्नम लाइब्रेरी को अनुकूलित कर सकूं।

मैं इस गणना और हर बार कार्यक्रम तो चलाता है एक चर में भंडारण पर योजना यह blindingly उपवास होने की जरूरत नहीं है - मैं यह सोचते हैं रहा हूँ एन्कोडिंग कार्यक्रम चलाने के दौरान परिवर्तन नहीं होगा :-)

+5

आपको कभी भी रन-टाइम पर ऐसा करने की आवश्यकता नहीं होगी - यह एक विशिष्ट आर्किटेक्चर के लिए संकलन करते समय पूरी तरह से एक संकलन-समय समस्या है। –

+2

बिग्नम पुस्तकालयों के लिए आप लगभग हमेशा बिना हस्ताक्षर किए गए प्रकार चाहते हैं। जबकि आप उच्चतम आदेश शब्द के लिए एक हस्ताक्षरित प्रकार का उपयोग करने में सक्षम हो सकते हैं, तो शायद एक अलग साइन बिट स्टोर करना और हमेशा सकारात्मक संख्याओं के साथ काम करना आसान है, और फिर साइन बिट के आधार पर अतिरिक्त/घटाव की भावना को फ़्लिप करें। असल में आपका स्वयं का संकेत/परिमाण प्रतिनिधित्व। –

उत्तर

16

आपको -1 & 3 जैसे कुछ के साथ स्थिर -1 की निम्न ऑर्डर बिट्स को जांचना होगा। यह दो के पूरक के लिए

    हस्ताक्षर और परिमाण के लिए
  1. , किसी के पूरक के लिए
  2. और
  3. मूल्यांकन करता है।

#if #else संरचनाओं के अंदर प्रीप्रोसेसर अभिव्यक्ति में ऐसा करना भी संभव होना चाहिए।

+0

@ जेन्स गस्टेड के उत्तरदाता बहुत अच्छा! लेकिन क्रॉस-संकलन के दौरान, यहां वास्तव में क्या जांच की जाती है, कंपाइलर (प्रीप्रोसेसर) या लक्ष्य मशीन का एन्कोडिंग? – user2596047

+1

@ user2596047, एक कंपाइलर को हमेशा सभी अभिव्यक्तियों का मूल्यांकन करना चाहिए जैसे कि उनका रन टाइम पर मूल्यांकन किया गया था, जैसे कि जेनरेट कोड का निष्पादन तथाकथित "अमूर्त राज्य मशीन" जैसा ही व्यवहार करता है। तो हाँ, क्रॉस-संकलन के लिए भी, यह लक्ष्य मशीन के अंकगणित में किया जाना चाहिए, मेजबान मशीन नहीं। –

12

किसी के पूरक का पता लगाना बहुत आसान होना चाहिए - if (-x == ~x) जैसे कुछ। दो के पूरक का पता लगाना उतना ही आसान होना चाहिए: if (-x == ~x + 1)। यदि यह उनमें से न तो है, तो यह संकेत/परिमाण होना चाहिए।

+5

ये निरंतर अभिव्यक्ति भी हैं, इसलिए आप उन्हें # # if' परीक्षणों में उपयोग कर सकते हैं: '# TWOSCOMPLEMENT (~ -1 == 0) 'फिर' #IF TWOSCOMPLEMENT' परिभाषित करें। – caf

+3

हालांकि आपकी अभिव्यक्तियां 'x' के सभी मामलों के लिए जरूरी नहीं हैं, इसलिए आपको सीमा मामलों से सावधान रहना चाहिए। विशेष रूप से दो के पूरक के लिए यह बुरा मामला है जहां '-x' अपरिभाषित व्यवहार को बढ़ावा देता है, अर्थात् '-INT_MIN' सीमा से बाहर हो सकता है। –

2

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

-1

मुझे लगता है कि आप एक int के रूप में एक नकारात्मक संख्या को char सरणी में रखने के लिए पर्याप्त रूप से पर्याप्त रखेंगे और पता लगाने के लिए विभिन्न प्रस्तुतियों के साथ सरणी की तुलना करें।

लेकिन उहम ... हस्ताक्षरित पूर्णांक के पास कोई संकेत नहीं होना चाहिए, है ना?

+0

हाँ ... लगता है कि मैं बहुत जटिल सोच रहा था ... जांचने के लिए बिट ऑपरेशंस का उपयोग करने के बारे में जैरी का अधिकार। कोई बात नहीं। इसे एक वैकल्पिक उत्तर के रूप में यहां छोड़कर। – Archimedix

+0

हाँ, क्षमा करें, यह हस्ताक्षर किया जाना चाहिए था। – paxdiablo

0

एक int को एक पॉइंटर प्राप्त करें जो एक विशिष्ट बिट-पैटर्न दिखाएगा। इसे बिना हस्ताक्षर किए गए int के पॉइंटर के रूप में कास्ट करें और फिर बिट मानों की जांच करें।

कुछ सावधानी से चुने गए मूल्यों के साथ ऐसा करने से आप जो चाहते हैं उसे करना चाहिए।