अहस्ताक्षरित डेटाटाइप क्या है?


90

मैंने इस unsigned"टाइपलेस" प्रकार को एक-दो बार देखा है, लेकिन इसके लिए स्पष्टीकरण कभी नहीं देखा। मुझे लगता है कि वहाँ एक इसी signedप्रकार है। यहाँ एक उदाहरण है:

static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
    next = seed;
}

मैंने अब तक क्या इकट्ठा किया है:
- मेरे सिस्टम पर, sizeof(unsigned) = 4(एक 32-बिट अहस्ताक्षरित int पर संकेत)
- यह अहस्ताक्षरित संस्करण के लिए एक और प्रकार के कास्टिंग के लिए शॉर्टहैंड के रूप में इस्तेमाल किया जा सकता है:

signed long int i = -42;
printf("%u\n", (unsigned)i);

यह एएनएसआई सी है, या सिर्फ एक संकलक विस्तार है?

जवाबों:



30

unsignedका मतलब है unsigned intsignedका मतलब है signed int। सी। में unsignedघोषित करने का सिर्फ एक आलसी तरीका है unsigned intहां यह एएनएसआई है।


14

ऐतिहासिक रूप से C में, यदि आपने एक डेटाटाइप छोड़ा है तो "int" मान लिया गया था। तो "अहस्ताक्षरित" "अहस्ताक्षरित int" के लिए एक आशुलिपि है। यह लंबे समय से खराब प्रथा मानी जाती रही है, लेकिन अभी भी कोड आउट की एक उचित मात्रा है जो इसका उपयोग करती है।


6
मुझे नहीं पता था कि यह बुरा व्यवहार था। क्या इसके लिए कोई औचित्य है? longइसके बजाय long intबहुत आम है इसलिए मुझे यकीन नहीं है कि unsignedइसके बजाय unsigned intस्वीकार्य क्यों नहीं होगा।
सीबी बेली

10
@Charles बेली: इन दिनों - कम से कम अगर आप औपचारिक के बजाय व्यावहारिक हो रहे हैं - अहस्ताक्षरित (और डिफ़ॉल्ट के रूप में, वे अलग-अलग आकार के हो सकते हैं) को अलग-अलग माना जाता है (और डिफ़ॉल्ट रूप से, साइन इन किया जा रहा है) क्वालीफायर। इस प्रकार आप "अहस्ताक्षरित int" का उपयोग उसी तरह से करेंगे जैसे आप "अहस्ताक्षरित लंबे" या "अहस्ताक्षरित चार" का उपयोग करेंगे (और यह स्पष्ट करता है कि आप सिर्फ int को याद नहीं करते थे)। "लॉन्ग इन्ट" या "शॉर्ट इंट" का उदाहरण बहुत ही शानदार है।
डिपस्टिक

1
@ डिपस्टिक, "लॉन्ग" "इंट" के लिए एक क्वालीफायर है। "अहस्ताक्षरित int" में उदाहरण की तरह लगता है कि "अहस्ताक्षरित लंबे int में int" के समान ही है।
कॉनरेड मेयर

1
यह निहित "इंट" नियम के समान नहीं है। यह उत्तर भ्रामक है।

7

सी में, के unsignedलिए एक शॉर्टकट है unsigned int

आपके पास इसके लिए वही है longजो इसके लिए एक शॉर्टकट हैlong int

और यह घोषित करना भी संभव है कि unsigned longयह (ए unsigned long int) होगा।

यह एएनएसआई मानक में है


हाँ। unsignedजैसा है, unsigned intलेकिन मैंने WG14 / N1124 समिति ड्राफ्ट - 6 मई, 2005 ISO / IEC 9899: TC2 के लिए एक खोज की थी unsignedऔर यह नहीं पाया गया कि कहां परिभाषित किया गया है ... क्या आप उस हिस्से का हवाला दे सकते हैं जहां इसे परिभाषित किया गया है?
user454322

5

C और C ++ में

unsigned = unsigned int (Integer type)
signed   = signed int (Integer type)

एन बिट्स वाले एक अहस्ताक्षरित पूर्णांक में 0 और (2 ^ n-1) के बीच मान हो सकता है, जो 2 ^ n भिन्न मान है।

एक अहस्ताक्षरित पूर्णांक या तो धनात्मक या शून्य होता है।

साइन किए गए पूर्णांक 2 के पूरक का उपयोग करके कंप्यूटर में संग्रहीत किए जाते हैं।


2

C17 के अनुसार 6.7.2 .22:

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

- शून्य
- char
- हस्ताक्षरित चार
- अहस्ताक्षरित चार
- लघु, हस्ताक्षरित लघु, लघु int, या हस्ताक्षर किए लघु int
- अहस्ताक्षरित लघु, या अहस्ताक्षरित लघु int
- int, हस्ताक्षर किए, या हस्ताक्षर किए int
- अहस्ताक्षरित, या अहस्ताक्षरित int
- लंबे, हस्ताक्षर किए लंबे , लंबे int, या हस्ताक्षर किए लंबे int
- अहस्ताक्षरित लंबे, या अहस्ताक्षरित लंबे int
- लंबे लंबे, हस्ताक्षर किए लंबे लंबे, लंबे int, या लंबे लंबे int हस्ताक्षर किए
- अहस्ताक्षरित लंबे लंबे, या अहस्ताक्षरित लंबे लंबे int
- नाव
- डबल
- लंबे
- _Bool
- float _Complex
- double _Complex
- लंबी डबल _Complex
- परमाणु प्रकार नमूना
- struct या संघ विनिर्देशक
- enum विनिर्देशक
- typedef नाम

तो मामले में की unsigned intहम या तो लिख सकते हैं unsignedया unsigned int, या हम पागल महसूस कर रहे हैं, int unsigned। उत्तरार्द्ध चूंकि मानक "अनुमति देने के लिए पर्याप्त बेवकूफ है" ... किसी भी क्रम में हो सकता है, संभवतः रुक-रुक कर "। यह भाषा का एक ज्ञात दोष है।

उचित सी कोड का उपयोग करता है unsigned int


1

एक और सवाल से मेरा जवाब लाना ।

से सी विनिर्देश , खंड 6.7.2:

- अहस्ताक्षरित, या अहस्ताक्षरित int

इसका मतलब है कि unsigned, जब प्रकार निर्दिष्ट नहीं किया जाता है, तो डिफ़ॉल्ट रूप से होगा unsigned int। इसलिए लेखन unsigned aवैसा ही है unsigned int a

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.