2010-06-12 19 views
7

सी ++ में हम प्राइमेटिव unsigned बना सकते हैं। लेकिन वे हमेशा सकारात्मक होते हैं। क्या हस्ताक्षर किए गए नकारात्मक चर बनाने का कोई तरीका है? मुझे बिना हस्ताक्षर किए गए शब्द "हस्ताक्षर किए गए शब्द" पता है, इसलिए एक ऋण (-) चिह्न भी नहीं है। लेकिन मुझे लगता है कि सी ++ इसे प्रदान करना होगा।असीमित नकारात्मक प्राइमेटिव्स?

+0

सी/सी ++ में "हस्ताक्षरित" वास्तव में nonnegative के लिए समानार्थी है। –

+13

बस मान लें कि वे नकारात्मक संख्याओं का प्रतिनिधित्व करते हैं। – AraK

+1

दिलचस्प सवाल मैंने पहले कभी नहीं सुना है। दुर्भाग्य से, जवाब नहीं है।" –

उत्तर

4

सं। unsigned में केवल गैर-संख्यात्मक संख्याएं हो सकती हैं।

यदि आपको एक ऐसे प्रकार की आवश्यकता है जो केवल ऋणात्मक संख्याओं का प्रतिनिधित्व करे, तो आपको स्वयं को एक कक्षा लिखनी होगी, या केवल अपने प्रोग्राम में मूल्य को नकारात्मक समझना होगा।

(लेकिन आप इस तरह के एक प्रकार की जरूरत क्यों करते हैं?)

+0

तो, अगर मैं वास्तव में यह चाहता हूं, तो मुझे अपनी खुद की कक्षा बनाने और नकारात्मक ऑपरेटर अनुकरण करने के लिए कुछ ऑपरेटर ओवरलोडिंग करने की आवश्यकता होगी? –

+0

@ केनीटीएम: अगर मैं जितनी कम संभव स्मृति का उपयोग करना चाहता हूं। –

+1

@ मार्टिजन: यह समयपूर्व अनुकूलन की तरह लगता है। आपको कितने नंबर चाहिए? उन संख्याओं की सीमा क्या है? – kennytm

2

unsigned पूर्णांक केवल सकारात्मक रहे हैं। 2003 C++ मानक के 3.9.1 पैरा 3 से:

एक पर हस्ताक्षर किए पूर्णांक प्रकार के गैर नकारात्मक मानों की श्रेणी के subrange इसी अहस्ताक्षरित पूर्णांक प्रकार, और प्रत्येक की कीमत प्रतिनिधित्व वाली संबंधित हस्ताक्षर किए है/हस्ताक्षरित प्रकार समान होगा।

हस्ताक्षरित पूर्णांक प्रकारों का मुख्य उद्देश्य मॉड्यूलो अंकगणितीय का समर्थन करना है। 3.9.1 अनुच्छेद 4 से:

अहस्ताक्षरित पूर्णांकों, अहस्ताक्षरित घोषित, अंकगणित सापेक्ष के नियमों का पालन करेगा 2 n जहां n कि विशेष रूप से आकार का मूल्य प्रतिनिधित्व में बिट्स के संख्या है पूर्णांक का।

यदि आप चाहें तो नकारात्मक रूप से उनका इलाज करने के लिए आप नि: शुल्क हैं, आपको बस किसी भी तरह (शायद एक बूलियन ध्वज के साथ) का ट्रैक रखना होगा।

0

मुझे लगता है कि आप इसे गलत तरीके से सोच रहे हैं।

आप एक ऋणात्मक संख्या चाहते हैं, तो आप चर अहस्ताक्षरित के रूप में घोषित नहीं करना चाहिए।

आपकी समस्या को मूल्य सीमा है, और आपको लगता है कि एक और बिट, तो आप एक "बड़ा" डेटा प्रकार इस्तेमाल कर सकते हैं चाहते हैं (उदाहरण के लिए 64 int ...)।

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

0

नाम से मूर्ख मत बनो: हस्ताक्षर किए जाने वाले अक्सर गैर-नकारात्मक के रूप में गलत समझा जाता है, लेकिन भाषा के नियम अलग-अलग होते हैं ... शायद एक बेहतर नाम "बिटमैस्क" या "मॉड्यूलो_इन्टेगर" होता।

यदि आपको लगता है कि हस्ताक्षरित गैर-ऋणात्मक है तो उदाहरण के लिए निहित रूपांतरण नियम कुल बकवास हैं (क्यों दो गैर-नकारात्मक के बीच अंतर गैर-नकारात्मक होना चाहिए? गैर-नकारात्मक और पूर्णांक के अतिरिक्त क्यों होना चाहिए गैर नकारात्मक हो?)।

यह बहुत दुर्भाग्यपूर्ण है कि सी ++ मानक लाइब्रेरी स्वयं उस गलतफहमी में गिर गई क्योंकि उदाहरण के लिए vector.size() को हस्ताक्षर नहीं किया गया है (बेतुका अगर आप इसका अर्थ यह है कि भाषा स्वयं बिटमैस्क या मॉड्यूलो_इन्टेगर के मामले में होती है)।आकारों के लिए इस विकल्प को पुराने 16-बिट बार बिना हस्ताक्षर किए गए नास के साथ करना है और यह मेरी राय में एक भयानक पसंद है जिसे हम अभी भी बग के रूप में भुगतान कर रहे हैं।

+2

vector.size() पर हस्ताक्षर करने से क्या लाभ मिलता है? यह कभी ऋणात्मक मूल्य वापस नहीं कर सकता है। हस्ताक्षरित/हस्ताक्षरित होने के कारण वास्तव में कौन सी बग उत्पन्न होती है? यह सौदा करने के लिए एक बहुत ही सरल अवधारणा है। – Puppy

+0

मैंने देखा सबसे आम बग 0 से vector.size() - 1 है कि एक खाली वेक्टर के लिए एक बड़ी संख्या है। अन्य संभावित बग इस तथ्य से उत्पन्न होते हैं कि ए - बी> 0 ए> बी के समान नहीं है। ध्यान दें कि यह सब इसलिए होता है क्योंकि सी ++ के लिए हस्ताक्षरित का अर्थ है ज़ेड [एन] "(ज़ेड [एन] = पूर्णांक मॉड्यूलो एन) का तत्व कम या कम है और इसमें साइन के साथ कुछ लेना देना नहीं है। आपकी राय में यह समझ में आता है कि वेक्टर में तत्वों की संख्या उस अंगूठी का एक तत्व है? बिना हस्ताक्षर किए गए इंट्स आईएमओ वास्तव में बहुत उपयोगी हैं ... लेकिन मात्रा के रूप में नहीं। – 6502

+1

ठीक है, तो आपको एक अप्रत्याशित मान मिलता है। अंडरफ्लो प्राप्त करने से बेहतर कैसे है? कम से कम इस तरह आप अपनी याददाश्त को उलझन में नहीं डाल रहे हैं। –

0

लेकिन मुझे लगता है कि सी ++ इसे प्रदान करना होगा।

क्यों? आपको लगता है कि सी ++ को गैर-नकारात्मक संख्या नकारात्मक बनाने की क्षमता प्रदान करनी चाहिए? यह मूर्खतापूर्ण है।

सी ++ में असाइन किए गए मान हमेशा गैर-नकारात्मक होने के लिए परिभाषित किए जाते हैं। वे शून्य पर — को बहने के बजाय — को भी लपेटते हैं! (और सीमा के दूसरे छोर पर)