2012-07-27 91 views
5

एक 16 बिट सी कंपाइलर में हमारे पास एक पूर्णांक को स्टोर करने के लिए 2 बाइट्स हैं, और एक वर्ण के लिए 1 बाइट है। हस्ताक्षरित पूर्णांक के लिए सीमा 0 से 65535 है। हस्ताक्षरित पूर्णांक के लिए सीमा -32768 से 32767 है। हस्ताक्षर किए गए चरित्र के लिए, 0 से 255. पूर्णांक प्रकार के अनुसार, हस्ताक्षरित वर्ण सीमा 127-127 तक नहीं होनी चाहिए। लेकिन क्यों -127 से 127? शेष एक बिट के बारे में क्या?16-बिट डेटा-प्रकार रेंज में भ्रम

उत्तर

15

मुझे लगता है कि आपको दो बातें मिश्रण कर रहे हैं:

  1. क्या पर्वतमाला मानक की आवश्यकता है signed char के लिए, int आदि
  2. क्या पर्वतमाला सबसे हार्डवेयर में कार्यान्वित इन दिनों कर रहे हैं।

इन्हें तब तक जरूरी नहीं होना चाहिए जब तक कि लागू की गई सीमा मानक द्वारा आवश्यक सीमा का एक सुपरसेट है।

SCHAR_MIN -127 
SCHAR_MAX +127 

यानी केवल 255:

the C standard के अनुसार, SCHAR_MIN और SCHAR_MAXके कार्यान्वयन से परिभाषित मूल्यों बराबर या परिमाण (निरपेक्ष मूल्य) के लिए, और के रूप में एक ही हस्ताक्षर के में अधिक से अधिक हो जाएगा मूल्य, नहीं।

हालांकि, एक अनुपालन कार्यान्वयन द्वारा परिभाषित सीमाएं इनकी तुलना में परिमाण में 'अधिक' हो सकती हैं। i.e. [-128,+127] मानक द्वारा भी अनुमति है। और चूंकि अधिकांश मशीन 2's complement form में 0 संख्याओं का प्रतिनिधित्व करती हैं, [-128,+127] वह सीमा है जिसे आप अक्सर देख सकते हैं।

वास्तव में, भीint की न्यूनतम सीमा सी मानक द्वारा परिभाषित सममित शून्य के बारे में है। यह है:

INT_MIN -32767 
INT_MAX +32767 

अर्थात केवल 65535 मूल्यों, नहीं 65536

लेकिन फिर से, अधिकांश मशीनें 2's complement प्रतिनिधित्व का उपयोग करती हैं, और इसका मतलब है कि वे [-32768,+32767] श्रेणी प्रदान करते हैं।

2's complement form में जबकि 8 बिट्स (यानी [-128,+127]) में 256 हस्ताक्षरित मानों का प्रतिनिधित्व करना संभव है, अन्य हस्ताक्षरित संख्या प्रतिनिधित्व हैं जहां यह संभव नहीं है।

sign-magnitude representation में, एक सा संकेत के लिए आरक्षित है, तो:

00000000 
10000000 

दोनों एक ही बात मतलब है, अर्थात 0 (या बल्कि, +0 और -0)।

इसका मतलब है, एक मान बर्बाद हो गया है। और इस प्रकार साइन-आयाम प्रतिनिधित्व केवल 8 बिट्स में -127 (11111111) से +127 (01111111) तक मान रख सकता है।

one's complement representation में (नहीं बिटवाइज़ करके नकारना):

00000000 
11111111 

दोनों एक ही बात मतलब है, अर्थात 0

फिर से, 127 (10000000) से +127 (01111111) के मान केवल 8 बिट्स में प्रदर्शित किए जा सकते हैं।

यदि सी मानक को [-128,+127] होने की आवश्यकता होती है, तो यह अनिवार्य रूप से सी प्रोग्राम चलाने में सक्षम होने से ऐसे प्रस्तुतियों का उपयोग करके मशीनों को बाहर कर देगा। उन्हें इस श्रेणी का प्रतिनिधित्व करने के लिए एक अतिरिक्त बिट की आवश्यकता होगी, इस प्रकार 8 बिट्स के बजाय हस्ताक्षरित वर्णों को स्टोर करने के लिए 9 बिट्स की आवश्यकता होगी। उपर्युक्त पर आधारित तर्कसंगत निष्कर्ष यह है: यही कारण है कि सी मानक को हस्ताक्षर किए गए वर्णों के लिए [-127,+127] की आवश्यकता होती है। यानी कार्यान्वयन को पूर्णांक प्रतिनिधित्व का एक रूप चुनने की स्वतंत्रता की अनुमति देने के लिए जो उनकी आवश्यकताओं के अनुरूप है और साथ ही साथ एक कुशल तरीके से मानक का पालन करने में सक्षम हो। एक ही तर्क int पर भी लागू होता है।

+0

वर्ष स्पष्टीकरण के लिए धन्यवाद। –