2011-10-12 9 views
6

हर बार जब मैं unsigned कीवर्ड यह int से पहले किया गया है, या किसी अन्य का उपयोग किया है निर्मित में टाइप करें। मैं सोच रहा था कि unsigned का कोई अन्य तरीका इस्तेमाल किया जा सकता था।क्या हस्ताक्षर किए गए कीवर्ड को गैर-स्पष्ट तरीकों से उपयोग किया जा सकता है?

  • सकते हैं उपयोगकर्ता परिभाषित प्रकार (वर्ग/structs) unsigned कीवर्ड का उपयोग करें?
  • क्या टेम्पलेट unsigned के साथ विशेष उपयोग कर सकते हैं?

यदि नहीं, तो इसका अपना कीवर्ड क्यों है? unsigned int क्यों uint क्यों है?

+0

है, मैं किसी अन्य * अजीब * उपयोग के मामले के बारे में सोच नहीं कर सकते। –

+0

इस प्रश्न का शीर्षक और अंतिम ... पाठ में प्रश्न काफी अलग हैं। इनमें से कौनसा? – Jon

+1

मैंने हमेशा कामना की है कि मैं 'बिगिन' कक्षा के साथ 'हस्ताक्षरित' का उपयोग कर सकता हूं। –

उत्तर

4

नहीं, यह वर्ग या structs के साथ नहीं किया जा सकता क्योंकि वे अभिन्न प्रकार नहीं कर रहे हैं। सभी टेम्पलेट इसके साथ कर सकते हैं एक int हस्ताक्षर किए गए हैं। मुझे लगता है कि इसे एक अलग खोजशब्द के रूप में चुना गया था क्योंकि इसे किसी भी पूर्णांक प्रकार (चार, int, long, long long) पर लागू किया जा सकता है, जिससे एक कीवर्ड के साथ प्राप्त किया जा सकता है जिसके लिए चार और आवश्यक होंगे। इसका अर्थ भी तत्काल स्पष्ट है, जबकि यूंट, उचर इत्यादि जरूरी नहीं हैं। और ध्यान रखें कि इसे क्वालीफायर के बिना भी इस्तेमाल किया जा सकता है, जिस स्थिति में बिना हस्ताक्षर किए गए int को माना जाता है।

+0

संख्यात्मक गलत है, वास्तव में आपको अभिन्न प्रकार कहा जाना चाहिए था। –

+0

अधिक सटीक, अंतर्निहित अभिन्न प्रकार। BigInt एक अभिन्न प्रकार है। –

+0

@ 0 ए0 डी: तकनीकी रूप से, हां, लेकिन मैंने विशेष रूप से इस तथ्य को हाइलाइट करने के लिए 'न्यूमेरिक' शब्द का उपयोग किया था कि केवल संख्यात्मक प्रकारों में एक संकेत की गुणवत्ता हो सकती है। –

2

कोई हस्ताक्षरित नहीं है वास्तव में कोई कीवर्ड नहीं है; यह int, छोटा, चार के लिए केवल एक संशोधक है।

unsigned कीवर्ड int, short, char, या long के लिए एक आपरिवर्तक के रूप में इस्तेमाल किया जा सकता। इसका इस्तेमाल एक प्रकार के नाम के रूप में भी किया जा सकता है; unsigned का अर्थ है unsigned int

यह तीन अतिरिक्त कीवर्ड रखने से बचने के लिए ऐसा किया गया था ताकि यूसुर्ट यूचर हो और क्योंकि हस्ताक्षर/हस्ताक्षर किए गए सभी शुरुआती कंप्यूटर सी और यूनिक्स पर अलग नहीं हो सकते थे।

+0

अच्छी तरह से, वास्तव में यह 'टाइप-विनिर्देशक' नहीं है 'संशोधक'। सी ++ आईएसओ मानक में 7.1.5 देखें। –

+0

यह देखें [लिंक] (http://en.cppreference.com/w/cpp/keywords/unsigned) – COD3BOY

+1

@ संजय: मुझे जो परवाह है, उसकी परवाह नहीं है, 7.1.5 में आईएसओ मानक पढ़ें। http://www-d0.fnal.gov/~dladams/cxx_standard.pdf –

3

unsigned एक कीवर्ड है। unsigned का उपयोग केवल अभिन्न प्रकारों पर किया जा सकता है। unsigned या signed को एक प्रकार-विनिर्देशक, एक साधारण प्रकार-विनिर्देशक माना जाता है। इसलिए वे निर्दिष्ट करते हैं कि प्रकार या तो हस्ताक्षरित या हस्ताक्षरित होगा।

आप शब्दों uint को unsigned inttypedef कर सकते हैं, लेकिन फिर यह है कि यह एक प्रकार की तरह लग रहे int प्रकार है और unsigned प्रकार-विनिर्देशक दर असल यह है कि जब होगा।

आप, अपने आप में unsigned, इसके विपरीत का उपयोग आम धारणा के रूप में कर सकते हैं सी ++ आईएसओ स्टैंडर्ड धारा 7.1.5.2 टेबल 7 से जाहिर होता है:

enter image description here

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

तुम भी ऐसा कर सकते हैं:

int unsigned i; 

और इस वैध सी ++ है।

1

हस्ताक्षर किए गए कीवर्ड, हस्ताक्षरित, संक्षिप्त, और लंबे प्रकार के संशोधक टाइपिफ़ायर/विनिर्देशक हैं और जब इन प्रकारों में से एक संशोधक/विनिर्देशक स्वयं ही उपयोग किया जाता है, तो डेटा प्रकार का int माना जाता है।

तो हस्ताक्षरित और हस्ताक्षरित used as standalone type specifiers भी हो सकता है, जिसका अर्थ क्रमशः हस्ताक्षरित int और हस्ताक्षरित int जैसा ही है। निम्नलिखित दो घोषणाओं के बराबर हैं:

unsigned abc; 

unsigned int abc; 
5

मुख्य प्रश्न कई बार उत्तर दिया गया है: unsigned कीवर्ड केवल एक अभिन्न प्रकार के लिए एक प्रकार-विनिर्देशक रूप में इस्तेमाल किया जा सकता है।

क्यों unsigned एक अलग कीवर्ड है, कहने के बजाय, uint कीवर्ड, इसके कारण ऐतिहासिक हैं। (, 8 बिट पर हस्ताक्षर किए, 2's-पूरक)

  • char
  • int (16 बिट, पर हस्ताक्षर किए, 2 की:

    सी के जल्द से जल्द संस्करणों (पूर्व कश्मीर & आर) केवल चार मौलिक प्रकार था -complement)

  • float (32 बिट)
  • double (64 बिट, float लेकिन अधिक से अधिक परिशुद्धता के समान सीमा)

नोट क्या याद आ रही है: कोई signed या unsigned कीवर्ड, कोई short, long, या long double; उन सभी को बाद में जोड़ा गया था। (प्रोग्रामर जिन्हें बिना हस्ताक्षर किए गए अंकगणित सामान्यतः उपयोग किए गए पॉइंटर्स की आवश्यकता होती है, जो int के साथ स्वतंत्र रूप से अदलाबदल करने योग्य थे।)

प्रत्येक मौलिक प्रकार का एक नाम था जो एक ही कीवर्ड था, जिसने व्याकरण को सीधे बनाया।

जब अन्य प्रकार बाद में जोड़ा गया था, यह नहीं बल्कि नए कीवर्ड्स शुरू (मौजूदा कोड हड्डी टूट गई है हो सकता है) की तुलना में मौजूदा प्रकार के नाम करने के लिए unsigned, short, और long तरह विनिर्देशक जोड़ना एक मतलब बनाया है। जब 1 9 8 9 में एएनएसआई सी समिति ने भाषा का मानकीकरण किया, तो उन्हें मौजूदा कार्यान्वयन के अनुरूप बने रहने के दौरान मौजूदा गैर-औपचारिक परिभाषाओं में से एक सुसंगत संरचना बनाना पड़ा। नतीजा यह है कि अब हमारे पास है, जहां int long unsigned long एक वैध प्रकार का नाम है (आमतौर पर unsigned long long के रूप में लिखा जाता है)।

यदि भाषा अब स्क्रैच से डिज़ाइन की गई थी, तो मुझे संदेह है कि एक अलग दृष्टिकोण लिया जाएगा। शायद प्रत्येक मौलिक प्रकार के लिए एक ही कीवर्ड होगा (उदाहरण के लिए सी # द्वारा लिया गया दृष्टिकोण), या शायद मौलिक प्रकार के नाम कीवर्ड की गड़बड़ी के बजाय कुछ और सुसंगत योजना का उपयोग करेंगे (कहें, int:2 2-बाइट के लिए 4-बाइट हस्ताक्षरित पूर्णांक के लिए पूर्णांक, unsigned:4)। लेकिन सी और सी ++ दोनों मौजूदा दृष्टिकोण से फंस गए हैं।

संदर्भ: http://cm.bell-labs.com/cm/cs/who/dmr/cman.pdf

0

वहाँ भी अहस्ताक्षरित चार है। जीएनयू के जी ++ जैसे कुछ कंपाइलर्स, आपको बस हस्ताक्षर किए जाने दें और मान लें कि आपका मतलब हस्ताक्षरित int है। उदाहरण के लिए निम्नलिखित कोड का उपयोग कर जब तक आप `मतलब अपने आप में unsigned` (` अहस्ताक्षरित int` के बराबर) बराबर

unsigned int x; 

unsigned x; 
संबंधित मुद्दे