हस्ताक्षरित और अहस्ताक्षरित int के बीच अंतर क्या है?
हस्ताक्षरित और अहस्ताक्षरित int के बीच अंतर क्या है?
जवाबों:
जैसा कि आप शायद जानते हैं, 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 int
s के लिए, इस बिट को "साइन बिट" के रूप में जाना जाता है।
(unsigned)(-1)
लिए अधिकतम प्रतिनिधित्व योग्य मूल्य होना आवश्यक है unsigned
, जो 2 के पूरक के लिए तुच्छ रूप से सच है, लेकिन अन्य प्रतिनिधित्व नहीं।
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
।)
कभी-कभी हम पहले से जानते हैं कि किसी दिए गए पूर्णांक चर में संग्रहीत मूल्य हमेशा सकारात्मक होगा-जब इसका उपयोग केवल चीजों को गिनने के लिए किया जा रहा है, उदाहरण के लिए। ऐसे मामले में हम वैरिएबल को डिसाइड करने की घोषणा कर सकते हैं, जैसे कि, में unsigned int num student;
। इस तरह की घोषणा के साथ, अनुमेय पूर्णांक मान (32-बिट संकलक के लिए) की सीमा -2147483648 से +2147483647 से 0 से 4294967295 तक होगी। इस प्रकार, पूर्णांक को अहस्ताक्षरित घोषित करना लगभग सबसे बड़ा आकार दोगुना हो जाता है। मूल्य है कि यह अन्यथा पकड़ कर सकते हैं।
आम आदमी की शर्तों में एक अहस्ताक्षरित int एक पूर्णांक है जो नकारात्मक नहीं हो सकता है और इस प्रकार सकारात्मक मूल्यों की एक उच्च श्रेणी है जो इसे ग्रहण कर सकते हैं। एक हस्ताक्षरित int एक पूर्णांक है जो ऋणात्मक हो सकता है, लेकिन अधिक नकारात्मक मानों के बदले में इसकी सकारात्मक सीमा कम है।
व्यवहार में, दो अंतर हैं:
cout
C ++ या printf
C में): अहस्ताक्षरित पूर्णांक बिट प्रतिनिधित्व को प्रिंट कार्यों द्वारा एक गैर-पूर्णांक के रूप में व्याख्या किया जाता है।यह कोड ऑर्डरिंग मानदंड का उपयोग करके पूर्णांक की पहचान कर सकता है:
char a = 0;
a--;
if (0 < a)
printf("unsigned");
else
printf("signed");