2015-05-11 6 views
7

char1 बाइट में लंबे समय तक क्यों है? यह 2 बाइट्स या 4 बाइट्स क्यों नहीं है?सी भाषा में 1 बाइट क्यों है

इसे 1 बाइट के रूप में रखने के लिए इसके पीछे मूल तर्क क्या है? मुझे जावा में पता है char2 बाइट लंबा है। इसके लिए एक ही सवाल है।

उत्तर

18

charC में 1 बाइट है क्योंकि इसे मानकों में निर्दिष्ट किया गया है।

सबसे संभावित तर्क है। char (मानक वर्ण सेट में) का (बाइनरी) प्रतिनिधित्व 1 बाइट में फिट हो सकता है। C के प्राथमिक विकास के समय, सबसे अधिक उपलब्ध मानकों ASCII और EBCDIC क्रमशः 7 और 8 बिट एन्कोडिंग की आवश्यकता थी। तो, 1 बाइट पूरे चरित्र सेट का प्रतिनिधित्व करने के लिए पर्याप्त था।

ओटीओएच, Java के दौरान चित्र में आया, विस्तारित चार कैटर सेट और unicode की अवधारणाएं मौजूद थीं। तो, भविष्य के सबूत और समर्थन विस्तारशीलता, char को 2 bytes दिया गया था, जो विस्तारित वर्ण सेट मानों को संभालने में सक्षम है।

+0

यप वास्तव में :-)। – Eregrith

+0

बेशक, यहां तक ​​कि वे भी खराब हो गए ... एक 16-बिट 'char' हर यूनिकोड चरित्र का प्रतिनिधित्व करने में सक्षम नहीं है। – duskwuff

+2

@ डस्कवफ: केवल इतना ही नहीं, लेकिन जब भी अंग्रेजी-केंद्रित होने से बचने का इरादा हो सकता है, तो कई उपयोग मामलों में यूटीएफ -16 यूटीएफ -8 की तुलना में थोक होने वाला होगा, यहां तक ​​कि उन भाषाओं के लिए भी जो कई वर्णों का प्रतिनिधित्व करेंगे कॉम्पैक्टली यूटीएफ -16 में, क्योंकि मशीनों की प्रक्रिया के अधिकांश पाठ को मानव-पठनीय के बजाय मशीन-पठनीय बनाने के लिए डिज़ाइन किया गया है, और मशीन-पठनीय पाठ आमतौर पर ASCII है। – supercat

5

char 1byte से अधिक क्यों होगा? एक char आमतौर पर एक ASCII चरित्र का प्रतिनिधित्व करता है। बस एएससीआईआईआई टेबल पर एक नज़र डालें, एएससीआईआई कोड (विस्तारित) में केवल 256 वर्ण हैं। इसलिए आपको केवल 0 से 255 तक संख्याओं का प्रतिनिधित्व करने की आवश्यकता है, जो 8 बिट = 1byte तक आती है।

एएससीआईआई टेबल पर एक नज़र डालें, उदा। यहां: http://www.asciitable.com/

सी के लिए चीजें जब जावा डिज़ाइन किया गया था तो उन्होंने अनुमान लगाया कि भविष्य में यह 16 बिट्स = 2 बाइट्स में होने वाले किसी भी चरित्र (यूनिकोड) के लिए पर्याप्त होगा।

5

ऐसा इसलिए है क्योंकि सी languange 37 साल पुराना है और 1 char के लिए अधिक बाइट्स की आवश्यकता नहीं थी, क्योंकि केवल 128 ASCII वर्णों का उपयोग किया गया था (http://en.wikipedia.org/wiki/ASCII)।

0

आपको पूरे एसीआई टेबल (128 वर्ण) का प्रतिनिधित्व करने के लिए बाइट से अधिक की आवश्यकता नहीं है।

लेकिन वहाँ जो अधिक कमरे डेटा शामिल करने के लिए है अन्य सी प्रकार, जैसे पूर्णांक प्रकार (4 बाइट्स) या लंबे डबल प्रकार (12 बाइट्स) कर रहे हैं।

इनमें से सभी संख्यात्मक मान होते हैं (यहां तक ​​कि वर्ण भी! अगर उन्हें "अक्षरों" के रूप में दर्शाया गया है, तो वे "संख्याएं" हैं, आप इसकी तुलना कर सकते हैं, इसे जोड़ सकते हैं ...)।

ये केवल मानक मानक हैं, जैसे कि सेमी और एम लंबाई के लिए।

2

जब सी विकसित किया गया था (इसकी पहली पुस्तक 1 ​​9 72 में अपने डेवलपर्स द्वारा प्रकाशित की गई थी), दो प्राथमिक चरित्र एन्कोडिंग मानकों एएससीआईआई और ईबीसीडीआईसी थे, जो क्रमशः पात्रों के लिए 7 और 8 बिट एन्कोडिंग थे। और स्मृति और डिस्क स्थान उस समय दोनों बड़ी चिंताओं थी; सी को 16-बिट एड्रेस स्पेस वाली मशीनों पर लोकप्रिय किया गया था, और तारों के लिए बाइट से अधिक का उपयोग करना कचरा माना जाता था।

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

0

सी भाषा मानक एक आभासी मशीन जहां सभी वस्तुओं सार भंडारण इकाइयों बिट्स के कुछ निश्चित संख्या (limits.h में CHAR_BIT मैक्रो द्वारा निर्दिष्ट) से बना का एक अभिन्न संख्या पर कब्जा परिभाषित करता है। प्रत्येक भंडारण इकाई विशिष्ट रूप से संबोधित करने योग्य होना चाहिए। एक स्टोरेज इकाई को मूल वर्ण सेट से एकल वर्ण द्वारा कब्जे वाले संग्रहण की मात्रा के रूप में परिभाषित किया जाता है। इस प्रकार, परिभाषा द्वारा, char प्रकार के आकार अंततः है 1.

, इन सार भंडारण इकाइयों भौतिक हार्डवेयर पर मैप किया जा करने के लिए है। सबसे आम आर्किटेक्चर व्यक्तिगत रूप से एड्रेसेबल 8-बिट बाइट्स का उपयोग करते हैं, इसलिए char ऑब्जेक्ट आमतौर पर एक 8-बिट बाइट पर मैप करते हैं।

आमतौर पर।

ऐतिहासिक रूप से, देशी बाइट आकार 6 से 9 बिट्स चौड़े से कहीं भी हैं। सी में, char टाइप कम से कम मूल वर्ण सेट में सभी वर्णों का प्रतिनिधित्व करने के लिए चौड़े होना चाहिए, इसलिए 6-बिट बाइट वाली मशीन का समर्थन करने के लिए, एक कंपाइलर को char ऑब्जेक्ट को दो पर मैप करना पड़ सकता है मूल मशीन बाइट्स, CHAR_BIT के साथ 12. sizeof (char) अभी भी 1 है, इसलिए N आकार वाले प्रकार 2 * N देशी बाइट्स पर नक्शा करेंगे।


1. बुनियादी वर्ण सेट दोनों ऊपरी और छोटे, 10 अंक, जैसे विराम चिह्न और अन्य ग्राफिक वर्ण, और नियंत्रण वर्ण नई-पंक्तियों, टैब, प्रपत्र फ़ीड, आदि में सभी 26 अंग्रेजी अक्षरों के होते हैं , जो सभी 8 बिट्स में आराम से फिट बैठते हैं।

+0

एएससीआईआई सिस्टम पर मूल चरित्र सेट आसानी से सात बिट्स में फिट हो सकता है; मुझे संदेह है कि 'char' कम से कम आठ होना आवश्यक है क्योंकि जब सी का आविष्कार किया गया था तो ऑक्टेट्स एक सामान्य मानक के रूप में उभरने लगे थे, कोई भी सात-बिट स्टोरेज इकाइयों का उपयोग नहीं करता था, और सात-बिट के साथ एक अस्पष्ट कल्पनाशील मशीन का समर्थन करने के लिए पीछे की तरफ झुकता था पता योग्य भंडारण इकाइयां सार्थक प्रतीत नहीं हुईं। – supercat

+0

आप सही हैं; मूल चरित्र सेट 7 बिट्स में फिट बैठता है (इसलिए यह 8 में आराम से क्यों फिट बैठता है)। 8 वें बिट को मूल रूप से त्रुटि जांच (कॉम लाइनों और स्मृति में दोनों) के लिए समानता बिट के रूप में उपयोग किया जाता था। फिर भी, सी मानक अनिवार्य है कि 'char' प्रकार कम से कम * 8 बिट्स पर कब्जा करते हैं, भले ही उन मूल पात्रों का प्रतिनिधित्व करने के लिए कितने बिट्स लेते हैं। –

+0

मुझे आश्चर्य है कि समानता जांच करने के लिए 8 बिट्स के बजाय 8 बिट्स का उपयोग किया गया था, या 8 का उपयोग किया गया था क्योंकि यहां तक ​​कि एक संख्या भी आसान थी, और समानता जांच को "हमें यह मिला है और हम भी हो सकते हैं इसके साथ कुछ करने की कोशिश करो "? एक ऑक्टेट आसानी से दो बेस -16 या बेस -10 मान, या चार बेस -4 मानों को स्टोर कर सकता है; एक सेक्स्टेट आसानी से दो बेस -8 या तीन बेस -4 मान रख सकता है। एक सेप्टेट थोड़े-क्रमशः दो बेस -10 मान या बेस -11 मान रख सकता है, लेकिन लगभग एक ऑक्टेट के रूप में आसानी से नहीं। – supercat

संबंधित मुद्दे