हेक्साडेसिमल संख्या 0x के साथ उपसर्ग क्यों हैं?


414

क्यों हेक्साडेसिमल संख्या के रूप में उपसर्ग हैं 0x? मैं उपसर्ग के उपयोग को समझता हूं लेकिन मुझे इस बात का महत्व समझ में नहीं आता कि क्यों 0xचुना गया था।


9
अब मुझे एहसास हुआ कि शीर्षक और पाठ दो पूरी तरह से अलग सवाल पूछते हैं। अधिकांश उत्तर शीर्षक में प्रश्न पर ध्यान केंद्रित करते हैं। पाठ में प्रश्न का उत्तर बस "यह कुछ भी मतलब नहीं है - यह केवल एक उपसर्ग है जो संकलक को बता रहा है कि पूर्णांक हेक्साडेसिमल में लिखा गया है"।
एंड्रियास रिबब्रांड

30
पांडित्यपूर्ण होने के लिए, कोई भी शीर्षक में दो अलग-अलग तरीकों से प्रश्न की व्याख्या कर सकता है: 1) "हेक्साडेसिमल संख्या 0x के रूप में उपसर्ग क्यों की जाती है, किसी अन्य उपसर्ग या संकेतक के विपरीत?" 2) "हेक्साडेसिमल संख्याओं को दर्ज करते समय हमें एक उपसर्ग का उपयोग करने की आवश्यकता क्यों है? निश्चित रूप से संकलक 58A को उपसर्ग के बिना भी एक हेक्साडेसिमल संख्या के रूप में मान्यता देगा?" प्रश्न की दूसरी व्याख्या का उत्तर तुच्छ है। "123" भी एक हेक्साडेसिमल संख्या है।
एंड्रियास रिबब्रांड

जवाबों:


440

लघु कथा:0 पार्सर यह एक निरंतर (और नहीं एक पहचानकर्ता / आरक्षित शब्द) के साथ काम कर रहा है बताता है। संख्या आधार को निर्दिष्ट करने के लिए अभी भी कुछ आवश्यक है: xएक मनमाना विकल्प है।

लंबी कहानी: 60 के दशक में, प्रचलित प्रोग्रामिंग नंबर सिस्टम दशमलव और ऑक्टल थे - मेनफ्रेम में प्रति बाइट 12, 24 या 36 बिट्स थे, जो 3 = लॉग 2 (8) द्वारा अच्छी तरह से विभाज्य है।

बीसीपीएल भाषा ने 8 1234अष्टक संख्याओं के लिए वाक्य रचना का उपयोग किया । जब केन थॉम्पसन ने बीसीपीएल से बी बनाया, तो उन्होंने 0इसके बजाय उपसर्ग का उपयोग किया। यह बहुत अच्छा है क्योंकि

  1. पूर्णांक स्थिरांक में हमेशा एक एकल टोकन होता है,
  2. पार्सर अभी भी बता सकता है कि यह एक स्थिर है,
  3. पार्सर तुरंत आधार बता सकता है ( 0दोनों आधारों में समान है),
  4. यह गणितीय रूप से समझदार है ( 00005 == 05), और
  5. किसी कीमती विशेष पात्र की जरूरत नहीं है (जैसा कि #123)।

जब C को B से बनाया गया था, तो हेक्साडेसिमल संख्याओं की आवश्यकता उत्पन्न हुई (PDP-11 में 16-बिट शब्द थे) और उपरोक्त सभी बिंदु अभी भी मान्य थे। चूंकि अन्य मशीनों के लिए ऑक्टल्स की आवश्यकता 0xथी , इसलिए उन्हें मनमाने ढंग से चुना 00गया था ( शायद अजीब के रूप में खारिज किया गया था)।

C # C का वंशज है, इसलिए यह सिंटैक्स को विरासत में मिला है।


112
मुझे नहीं लगता कि 0xअधिक 00वरीयता / भद्दापन था। 00मौजूदा कोड को तोड़ देगा। 0010जैसा कि अष्टक है 8, जबकि 0010हेक्सिडेसिमल होगा 16। वे किसी भी संख्या को दूसरे अंकों के संकेतक के रूप में उपयोग नहीं कर सकते हैं (सिवाय 8या इसके 9, और न ही हेक्सिडेसिमल से संबंधित कोई महत्व नहीं रखते हैं) इसलिए एक पत्र एक होना चाहिए। और जो 0hया तो छोड़ देता है या 0x( एचएक्स आइडीसीमल)। इस बिंदु से ऐसा लगता है कि यह वास्तव में वरीयता के लिए वापस आ गया है।
GManNickG


23
0अष्टक के लिए उपसर्ग का उपयोग करने से वर्षों में बहुत सारी समस्याएं पैदा हुई हैं। विशेष रूप से यूके जैसे देशों में जहां टेलीफोन नंबर एक से शुरू होते हैं 0। जावास्क्रिप्ट और कई अन्य भाषाओं में ऑक्टल के रूप में इनको पार्स किया जाएगा, स्टोर करने से पहले नंबर को मेन्यू करना। मज़े में जोड़ने के लिए, एक लोकप्रिय डेटाबेस उत्पाद चुपचाप दशमलव पार्सिंग पर वापस आ जाएगा यदि संख्या में एक 8या समाहित है 9
बेसिक

1
12, 24 और 36 भी 4 से विभाज्य हैं, इसलिए उन्होंने इसके लिए हेक्साडेसिमल के बारे में क्यों नहीं सोचा?
फुलेवव

4
@ LưuV LnhPhúc शायद क्योंकि हेक्साडेसिमल बहुत प्रासंगिक नहीं था। अधिकांश हार्डवेयर, सॉफ्टवेयर, और समय का प्रलेखन बहुत बेहतर फिट बैठता है। BCPL पहली बार 36 बिट IBM 7094 पर लागू किया गया था , जिसमें एक निर्देश प्रारूप दो 3 बिट भागों और 2 15 बिट भागों में विभाजित था; 6 बिट वर्ण; और अष्टाधारी में प्रलेखन। बी के शुरुआती कार्यान्वयन एक पीडीपी -7 (18 बिट) और एक हनीवेल जीई-945 (36 बिट, लेकिन 18 बिट एड्रेसिंग के साथ, और 6 और 9 बिट बाइट्स के लिए समर्थन) पर थे। 16 बिट पीडीपी -11 बी के बाद बाहर आया, इसलिए बी के डिजाइन को बहुत प्रभावित नहीं किया होगा।
8bittree

97

नोट: मुझे सही उत्तर नहीं पता, लेकिन नीचे सिर्फ मेरी व्यक्तिगत अटकलें हैं!

जैसा कि एक संख्या से पहले उल्लेख किया गया है इसका मतलब यह अष्टक है:

04524 // octal, leading 0

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

8000h // hex
FF00h // oops - valid identifier!  Hex or a variable or type named FF00h?

आप एक ही कारण के लिए एक चरित्र के साथ नेतृत्व नहीं कर सकते:

xFF00 // also valid identifier

हैश का उपयोग करना संभवत: बाहर फेंक दिया गया क्योंकि यह प्रीप्रोसेसर के साथ संघर्ष करता है:

#define ...
#FF00 // invalid preprocessor token?

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

0xFF00 // definitely not an identifier!

3
दिलचस्प। मुझे लगता है कि वे हेक्स को निरूपित करने के लिए एक अग्रणी 0 और अनुगामी एच का उपयोग कर सकते थे। अनुगामी एच शायद टाइप करने वाले प्रत्यय के साथ भ्रमित हो गया होगा, जैसे 0xFF00l बनाम 0FF00hl
zdan

2
इस तर्क का अर्थ है कि अष्टक संख्याओं को निरूपित करने के लिए एक प्रमुख शून्य का उपयोग हेक्साडेसिमल "0x" उपसर्ग का उपयोग करता है। क्या ये सच है?
एंड्रियास रिबब्रांड

1
क्या उन दोनों का आविष्कार एक ही समय में नहीं हुआ होगा? कभी एक क्यों होगा लेकिन दूसरा नहीं?
AshleysBrain

AshleysBrain @ ysr forola द्वारा उत्तर देखें कि क्यों एक ही समय में अष्टकोणीय हो सकता है लेकिन हेक्साडेसिमल नहीं हो सकता है।
jv42

2
@zdan वे बहुत समय पहले इसका इस्तेमाल कर चुके हैं। X86 इंटेल असेंबली में एक हेक्स शाब्दिक को हमेशा 0 से उपसर्ग करना चाहिए यदि वे एक चरित्र से शुरू होते हैं। उदाहरण के लिए के 0xFFAB1234रूप में लिखा जाना चाहिए 0FFAB1234h। मैं पास्कल में इनलाइन एएसएम से यह याद है जब मैं था युवा stackoverflow.com/q/11733731/995714
phuclv

27

यह इंगित करने के लिए एक उपसर्ग है कि संख्या किसी अन्य आधार के बजाय हेक्साडेसिमल में है। C प्रोग्रामिंग लैंग्वेज इसका इस्तेमाल कंपाइलर को बताने के लिए करती है।

उदाहरण:

0x6400करने के लिए अनुवाद 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600. जब संकलक पढ़ता है 0x6400, यह समझता संख्या की मदद से षोडश आधारी है 0x अवधि। आमतौर पर हम (6400) 16 या (6400) 8 या जो कुछ भी समझ सकते हैं ..

के लिए द्विआधारी यह होगा:

0b00000001

आशा है कि मैंने किसी तरह से मदद की है।

अच्छा दिन!


2
बाइनरी लीटर केवल C ++ 14 के बाद से C ++ में समर्थित हैं, और C में बिल्कुल भी समर्थित नहीं हैं।
रुस्लान

1
यह क्यों नहीं समझाता । विशेष रूप से, आप पहला उदाहरण क्यों नहीं लिख सकते x6400? xअभी भी हेक्साडेसिमल अनुमान लगाने के लिए इस्तेमाल किया जा सकता।
हारून फ्रेंके

12

पूर्ववर्ती 0 का उपयोग आधार 2, 8, या 16 में एक संख्या को इंगित करने के लिए किया जाता है।

मेरी राय में, 0x को हेक्स इंगित करने के लिए चुना गया था क्योंकि 'x' हेक्स की तरह लगता है।

बस मेरी राय है, लेकिन मुझे लगता है कि यह समझ में आता है।

अच्छा दिन!


2
जवाब के लिए धन्यवाद! मैं समझता हूं कि यह StackOverflow पर आपकी पहली पोस्ट है। यदि राय तथ्यों से अलग की जाती है तो उत्तर अधिक मददगार हो सकता है।
vivek_ganesan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.