हस्ताक्षरित और अहस्ताक्षरित int के बीच अंतर क्या है


91

हस्ताक्षरित और अहस्ताक्षरित int के बीच अंतर क्या है?


5
यह एक वास्तविक प्रश्न है, और उत्तर इतना सरल नहीं है, बल्कि सूक्ष्म है।
आर .. गिटहब स्टॉप हेल्पिंग ICE

फिर से मतदान करना। यह एक डुप्लिकेट हो सकता है, लेकिन यह निश्चित रूप से एक वास्तविक प्रश्न है।
ब्रायन


अधिक टैग जोड़े जाने चाहिए, क्योंकि कई भाषाएं उनका उपयोग करती हैं।
जुआन बोएरो

इस प्रश्न को विस्तृत करने के लिए एक अध्याय की आवश्यकता हो सकती है। यदि आप ins और outs जानना चाहते हैं, तो अधिक स्पष्टीकरण के लिए Unsigned और Signed Integers की जाँच करें ।
अनाम

जवाबों:


113

जैसा कि आप शायद जानते हैं, intबाइनरी में आंतरिक रूप से संग्रहीत होते हैं। आमतौर पर intइसमें 32 बिट्स होते हैं, लेकिन कुछ वातावरणों में 16 या 64 बिट्स (या यहां तक ​​कि एक अलग संख्या हो सकती है, आमतौर पर दो की शक्ति नहीं होती है)।

लेकिन इस उदाहरण के लिए, आइए 4-बिट पूर्णांक देखें। छोटे, लेकिन चित्रण प्रयोजनों के लिए उपयोगी।

चूंकि इस तरह के पूर्णांक में चार बिट्स होते हैं, इसलिए यह 16 मानों में से एक मान सकता है; 16 दो से चौथी शक्ति है, या 2 गुणा 2 गुणा 2 गुना 2. वे मूल्य क्या हैं? उत्तर इस बात पर निर्भर करता है कि यह पूर्णांक एक है signed intया नहीं unsigned int। A के साथ unsigned int, मान कभी भी ऋणात्मक नहीं होता है; मूल्य से जुड़ा कोई संकेत नहीं है। यहां चार-बिट के 16 संभावित मान दिए गए हैं unsigned int:

bits  value
0000    0
0001    1
0010    2
0011    3
0100    4
0101    5
0110    6
0111    7
1000    8
1001    9
1010   10
1011   11
1100   12
1101   13
1110   14
1111   15

... और यहां चार-बिट के 16 संभावित मान हैं signed int:

bits  value
0000    0
0001    1
0010    2
0011    3
0100    4
0101    5
0110    6
0111    7
1000   -8
1001   -7
1010   -6
1011   -5
1100   -4
1101   -3
1110   -2
1111   -1

जैसा कि आप देख सकते हैं, signed intसबसे महत्वपूर्ण बिट के लिए है 1और केवल अगर संख्या नकारात्मक है। इसीलिए, signed ints के लिए, इस बिट को "साइन बिट" के रूप में जाना जाता है।


11
शायद यह इंगित करने के लायक है कि यह दो का पूरक प्रारूप है, जो आजकल व्यापक रूप से उपयोग किया जाता है। हस्ताक्षरित पूर्णांक का प्रतिनिधित्व करने के अन्य तरीके भी हैं, विशेष रूप से किसी के पूरक।
11

सही बात। और ISO9899 C मानक को यह भी आवश्यकता नहीं है कि किसी के पूरक या दो के पूरक का उपयोग किया जाए; किसी भी अन्य सम्मेलन जो वास्तव में काम करता है वह अनुमेय है।
बिल इवांस मैरिपोसा

1
हालांकि दो के पूरक की आवश्यकता नहीं है, (द्विआधारी प्रतिनिधित्व से स्वतंत्र) के (unsigned)(-1)लिए अधिकतम प्रतिनिधित्व योग्य मूल्य होना आवश्यक है unsigned, जो 2 के पूरक के लिए तुच्छ रूप से सच है, लेकिन अन्य प्रतिनिधित्व नहीं।
रुबनेव

3
@BillEvansatMariposa: मानक कहता है कि हस्ताक्षर किए गए पूर्णांकों के लिए 3 अनुमत प्रतिनिधित्व हैं: हस्ताक्षर + परिमाण, 2 का पूरक, 1 का पूरक। किसी भी अन्य को कार्यक्रम के लिए अदृश्य होना होगा और इनमें से एक के रूप में माना जाएगा 3.
एलेक्सी फ्रुंज़े

ठीक है, लेकिन हुड के नीचे! वास्तव में क्या हो रहा है! SIGNED और UNSIGNED नंबर में क्या अंतर है! मशीन कम्प्यूटेशन का प्रबंधन कैसे करती है? यह सिर्फ दूसरे से एक मूल्य घटाता है? यह 1111 = 15 और 1111 = -1 में कैसे अंतर करता है?
मिखाइल जॉर्जेसकु

19

intऔर unsigned intदो अलग पूर्णांक प्रकार हैं। (के intरूप में भी जाना जा सकता है signed int, या बस signed, unsigned intके रूप में भी संदर्भित किया जा सकता है unsigned।)

जैसा कि नाम से पता चलता है, intएक हस्ताक्षरित पूर्णांक प्रकार है, और unsigned intएक अहस्ताक्षरित पूर्णांक प्रकार है। इसका मतलब है कि intनकारात्मक मूल्यों का प्रतिनिधित्व करने में सक्षम है, और unsigned intकेवल गैर-नकारात्मक मूल्यों का प्रतिनिधित्व कर सकता है।

सी भाषा इन प्रकारों की सीमाओं पर कुछ आवश्यकताओं को लगाती है। की सीमा intकम से कम होना चाहिए -32767.. +32767, और की सीमा unsigned intकम से कम होना चाहिए 0.. 65535। इसका मतलब है कि दोनों प्रकार कम से कम 16 बिट्स होने चाहिए। वे कई प्रणालियों पर 32 बिट्स हैं, या कुछ पर 64 बिट्स भी हैं। intअधिकांश आधुनिक प्रणालियों द्वारा उपयोग किए जाने वाले दो-पूरक प्रतिनिधित्व के कारण आम तौर पर एक अतिरिक्त नकारात्मक मूल्य होता है।

शायद सबसे महत्वपूर्ण अंतर हस्ताक्षरित बनाम अहस्ताक्षरित अंकगणित का व्यवहार है। हस्ताक्षरित के लिए int, अतिप्रवाह में अपरिभाषित व्यवहार होता है। के लिए unsigned int, कोई अतिप्रवाह नहीं है; कोई भी ऑपरेशन जो प्रकार की सीमा के बाहर एक मूल्य देता है, उदाहरण के लिए चारों ओर लपेटता है UINT_MAX + 1U == 0U

किसी भी पूर्णांक प्रकार, या तो हस्ताक्षर किए या अहस्ताक्षरित, गणितीय पूर्णांकों के अनंत सेट का एक उप-मॉडल बनाते हैं। जब तक आप एक प्रकार की सीमा के भीतर मूल्यों के साथ काम कर रहे हैं, तब तक सब कुछ काम करता है। जब आप किसी प्रकार के निचले या ऊपरी हिस्से से संपर्क करते हैं, तो आप एक असंगति का सामना करते हैं, और आप अप्रत्याशित परिणाम प्राप्त कर सकते हैं। हस्ताक्षरित पूर्णांक प्रकारों के लिए, समस्याएं केवल बहुत बड़े नकारात्मक और सकारात्मक मूल्यों के लिए होती हैं, से अधिक INT_MINऔर INT_MAX। अहस्ताक्षरित पूर्णांक प्रकारों के लिए, बहुत बड़े सकारात्मक मान और शून्य पर समस्याएं आती हैं । यह बग्स का स्रोत हो सकता है। उदाहरण के लिए, यह एक अनंत लूप है:

for (unsigned int i = 10; i >= 0; i --) [
    printf("%u\n", i);
}

क्योंकि iहै हमेशा से अधिक या शून्य के बराबर; यह अहस्ताक्षरित प्रकारों की प्रकृति है। (लूप के अंदर, जब iशून्य होता है, i--इसका मान सेट करता है UINT_MAX।)


12

कभी-कभी हम पहले से जानते हैं कि किसी दिए गए पूर्णांक चर में संग्रहीत मूल्य हमेशा सकारात्मक होगा-जब इसका उपयोग केवल चीजों को गिनने के लिए किया जा रहा है, उदाहरण के लिए। ऐसे मामले में हम वैरिएबल को डिसाइड करने की घोषणा कर सकते हैं, जैसे कि, में unsigned int num student;। इस तरह की घोषणा के साथ, अनुमेय पूर्णांक मान (32-बिट संकलक के लिए) की सीमा -2147483648 से +2147483647 से 0 से 4294967295 तक होगी। इस प्रकार, पूर्णांक को अहस्ताक्षरित घोषित करना लगभग सबसे बड़ा आकार दोगुना हो जाता है। मूल्य है कि यह अन्यथा पकड़ कर सकते हैं।


@ एलेक्स I संपादन के बीच में था जो 10mins पहले उत्तर देता था और यह समान है। lol
Skuld

12

आम आदमी की शर्तों में एक अहस्ताक्षरित int एक पूर्णांक है जो नकारात्मक नहीं हो सकता है और इस प्रकार सकारात्मक मूल्यों की एक उच्च श्रेणी है जो इसे ग्रहण कर सकते हैं। एक हस्ताक्षरित int एक पूर्णांक है जो ऋणात्मक हो सकता है, लेकिन अधिक नकारात्मक मानों के बदले में इसकी सकारात्मक सीमा कम है।


0

व्यवहार में, दो अंतर हैं:

  1. मुद्रण (उदाहरण के लिए coutC ++ या printfC में): अहस्ताक्षरित पूर्णांक बिट प्रतिनिधित्व को प्रिंट कार्यों द्वारा एक गैर-पूर्णांक के रूप में व्याख्या किया जाता है।
  2. आदेश देना : आदेश हस्ताक्षरित या अहस्ताक्षरित विनिर्देश पर निर्भर करता है।

यह कोड ऑर्डरिंग मानदंड का उपयोग करके पूर्णांक की पहचान कर सकता है:

char a = 0;
a--;
if (0 < a)
    printf("unsigned");
else
    printf("signed");

यदि यह एक नकारात्मक संख्याओं और दूसरे में व्यवहार करने वाले के साथ अलग समझाया, तो नहीं। यह इस पोस्ट को बहुत मदद करेगा।
डैनियल जैक्सन

@DanielJackson अस्पष्ट आप क्या कहते हैं। एक चार्जर को कंपाइलर के आधार पर नकारात्मक या सकारात्मक माना जा सकता है। कोड का आउटपुट इस बात पर निर्भर करता है कि संकलक क्या चुनता है और यह हस्ताक्षरित और अहस्ताक्षरित के बीच के अंतर को दर्शाता है।
मिनिमस हेमेसस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.