8-बिट चार के अलावा और क्या प्लेटफॉर्म हैं?


136

हर अब और फिर, एसओ पर किसी को बताते हैं कि char (उर्फ 'बाइट') 8 बिट्स जरूरी नहीं है

ऐसा लगता है कि 8-बिट char लगभग सार्वभौमिक है। मैंने सोचा होगा कि मुख्यधारा के प्लेटफार्मों के लिए, charबाजार में इसकी व्यवहार्यता सुनिश्चित करने के लिए 8-बिट होना आवश्यक है ।

दोनों अब और ऐतिहासिक रूप से, किस प्लेटफॉर्म का उपयोग करते हैं char 8 बिट्स का नहीं करते हैं, और वे "सामान्य" 8 बिट्स से अलग क्यों होंगे?

जब कोड लिखना, और क्रॉस-प्लेटफ़ॉर्म समर्थन के बारे में सोचना (जैसे सामान्य-उपयोग पुस्तकालयों के लिए), तो गैर-8-बिट वाले प्लेटफार्मों को देने के लिए यह किस प्रकार का विचार है। char ?

अतीत में मैं कुछ एनालॉग डिवाइसेस डीएसपी में आया हूं, जिसके charलिए 16 बिट्स हैं। डीएसपी एक आला वास्तुकला का एक हिस्सा है जो मुझे लगता है। (तब फिर से, हाथ से कोडित कोडांतरक ने आसानी से हरा दिया कि उपलब्ध सी कंपाइलर क्या कर सकता है, इसलिए मुझे उस प्लेटफ़ॉर्म पर सी के साथ वास्तव में बहुत अनुभव नहीं मिला।)


9
सीडीसी साइबर श्रृंखला में 6/12 बिट एन्कोडिंग थी। सबसे लोकप्रिय वर्ण 6 बिट्स थे। शेष पात्रों में 12 बिट्स का उपयोग किया गया था।
थॉमस मैथ्यूज

2
PDP-11 ने इसे नीचे गिरा दिया। यह धारणा कि एक चरित्र को एक चार में एन्कोड किया जा सकता है, गंभीर रूप से अप्रचलित है।
हंस पैसेंट

7
"PDP-11 ने इसे नीचे दिया" - आपका मतलब है क्योंकि C को पहली बार 8 बिट बाइट के साथ PDP-11 के लिए लागू किया गया था? लेकिन 9 बिट बाइट्स के साथ हनीवेल मशीनों के लिए सी को अगली बार लागू किया गया था। K & R संस्करण 1 देखें। इसके अलावा, चार (यानी बाइट) के बारे में पूछे जाने वाले प्रश्न चरित्र के बारे में नहीं (एक या अधिक बाइट्स जो कुछ के बारे में नहीं पूछा गया था) एन्कोडिंग।
विंडोज प्रोग्रामर

6
DEC-10 और DEC-20 में 36-बिट शब्द थे। पाँच 7-बिट ASCII वर्ण प्रति शब्द काफी सामान्य था। इसके अलावा छह 6-बिट पात्रों का उपयोग किया गया था।
डेविड आर ट्रिबल

3
@CigigMcQueen: अगर मुझे सही से याद है, Atmel microcontrollers के लिए CodeVision किसी को चार का आकार चुनने देता है
vsz

जवाबों:


80

charटेक्सास इंस्ट्रूमेंट्स C54x DSPs पर भी 16 बिट है, जो OMAP2 में उदाहरण के लिए बदल गया। वहाँ 16 और 32 बिट के साथ अन्य डीएसपी हैंchar । मुझे लगता है कि मैंने भी 24-बिट डीएसपी के बारे में सुना है, लेकिन मुझे याद नहीं है कि क्या हो सकता है, इसलिए शायद मैंने इसकी कल्पना की थी।

एक और विचार यह है कि POSIX जनादेश CHAR_BIT == 8। इसलिए यदि आप POSIX का उपयोग कर रहे हैं तो आप इसे मान सकते हैं। यदि बाद में किसी को आपके कोड को POSIX के निकट-कार्यान्वयन के लिए पोर्ट करना है, तो बस ऐसा होता है कि आपके द्वारा उपयोग किए जाने वाले फ़ंक्शन हैं, लेकिन एक अलग आकार है char, यह उनका दुर्भाग्य है।

सामान्य तौर पर, हालांकि, मुझे लगता है कि इस मुद्दे पर काम करना लगभग आसान है, इसके बारे में सोचने के बजाय। बस टाइप करें CHAR_BIT। यदि आप एक सटीक 8 बिट प्रकार चाहते हैं, तो उपयोग करें int8_t। आपका कोड उन कार्यान्वयनों को संकलित करने में विफल होगा जो आपको प्रदान नहीं करते हैं, इसके बजाय चुपचाप एक ऐसे आकार का उपयोग करें जिसकी आपको उम्मीद नहीं थी। बहुत कम से कम, अगर मैं एक ऐसा मामला मारता हूं, जहां मुझे यह मानने का एक अच्छा कारण था, तो मैं इसे मुखर करता हूं।


2
TI C62xx और C64xx DSP में 16-बिट वर्ण भी हैं। (uint8_t को उस प्लेटफ़ॉर्म पर परिभाषित नहीं किया गया है।)
myron-semack

7
ऑडियो प्रोसेसिंग के लिए कई डीएसपी 24-बिट मशीन हैं; BelaSigna अर्ध पर से DSPs (के बाद वे एएमआई अर्ध खरीदा); DSP56K / सिम्फनी ऑडियो फ्रीस्केल से DSPs (के बाद वे मोटोरोला से निकाला गया)।
डेविड कैरी

2
@msemack C64xx में 8/16/32/40 के हार्डवेयर हैं, और 8bit char
user3528438

4
बजाए assert()(यदि आप क्या मतलब है कि), मैं का उपयोग करें #if CHAR_BIT != 8... #error "I require CHAR_BIT == 8"...#endif
कीथ थॉम्पसन

1
@KeithThompson कोई कारण नहीं उपयोग करने के लिए है static_assert()?
Qix - MONICA WAS ने

37

कोड लिखते समय, और क्रॉस-प्लेटफ़ॉर्म समर्थन के बारे में सोच (जैसे सामान्य-उपयोग पुस्तकालयों के लिए), गैर-8-बिट चार्ट वाले प्लेटफार्मों को देने के लिए यह किस प्रकार का विचार है?

यह इतना नहीं है कि यह किसी चीज को "ध्यान देने लायक" है क्योंकि यह नियमों द्वारा खेल रहा है। उदाहरण के लिए C ++ में, मानक कहता है कि सभी बाइट्स में "कम से कम" 8 बिट्स होंगे। यदि आपका कोड मानता है कि बाइट्स में 8 बिट्स हैं, तो आप मानक का उल्लंघन कर रहे हैं।

यह अब मूर्खतापूर्ण लग सकता है - " बेशक सभी बाइट्स में 8 बिट्स होते हैं!", मैं आपको कहता सुनता हूं। लेकिन बहुत सारे स्मार्ट लोगों ने उन मान्यताओं पर भरोसा किया है जो गारंटी नहीं थे, और फिर सब कुछ टूट गया। इतिहास ऐसे उदाहरणों से परिपूर्ण है।

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


एक टिप्पणीकार ने पूछा कि मानक में यह कहां कहा गया है कि चार्ट में कम से कम 8 बिट्स होने चाहिए। यह खंड 5.2.4.2.1 में है । यह खंड CHAR_BITसबसे छोटी पता योग्य इकाई में बिट्स की संख्या को परिभाषित करता है , और इसका डिफ़ॉल्ट मान होता है। 8. यह भी कहता है:

उनके कार्यान्वयन-परिभाषित मूल्य एक ही संकेत के साथ दिखाए गए लोगों के लिए परिमाण (पूर्ण मूल्य) के बराबर या अधिक होंगे।

तो 8 या उच्चतर के बराबर कोई भी संख्या एक कार्यान्वयन में प्रतिस्थापन के लिए उपयुक्त है CHAR_BIT


6
मैंने कम से कम 20 वर्षों में एक टर्बो बटन नहीं देखा है - क्या आपको वास्तव में लगता है कि यह सवाल का जर्मेन है?
मार्क रैनसम

29
@ मर्क फिरौती: यह पूरी बात है। डेवलपर्स अक्सर उन धारणाओं पर भरोसा करते हैं जो इस समय सही प्रतीत होती हैं, लेकिन जो शुरू में दिखाई देती हैं, उससे कहीं ज्यादा शकीर हैं। (जितनी बार मैंने यह गलती की है, उसकी संख्या गिन नहीं सकते !) टर्बो बटन एक दर्दनाक अनुस्मारक होना चाहिए ताकि अनावश्यक मान्यताओं को न बनाया जाए, और निश्चित रूप से उन मान्यताओं को नहीं बनाया जाए जो किसी भाषा मानक द्वारा गारंटी नहीं हैं जैसे कि वे थे अपरिवर्तनीय तथ्य।
जॉन फेमिनाला

1
क्या आप C ++ मानक में जगह दे सकते हैं जो कहता है कि अलविदा में कम से कम 8 बिट्स हैं? यह एक आम धारणा है, लेकिन मैं इसे मानक में खोजने में व्यक्तिगत रूप से विफल रहा। केवल एक चीज जो मुझे स्टैंडर्ड में मिली, वह यह है कि कौन से वर्णों का प्रतिनिधित्व योग्य होना चाहिए char, उनमें से 64 से अधिक हैं, लेकिन कम से कम 128 तो 7 बिट्स पर्याप्त होंगे।
एडम बदुरा

6
धारा 18.2.2 इसके लिए C मानक को लागू करता है। C मानक में यह खंड 7.10 और फिर खंड 5.4.2.4.1 है। C मानक में पेज 22।
विंडोज प्रोग्रामर

2
इसलिए अन्य उत्तर और टिप्पणियों में 5 बिट, 6 बिट और 7 बिट बाइट्स के साथ मशीनों का उल्लेख है। इसका मतलब यह है कि आप उस मशीन पर एक सी प्रोग्राम नहीं चला सकते हैं जो मानक का अनुपालन करता है?
जेरी जेरेमिया

34

36-बिट आर्किटेक्चर वाली मशीनों में 9-बिट बाइट्स हैं। विकिपीडिया के अनुसार, 36-बिट आर्किटेक्चर वाली मशीनों में शामिल हैं:

  • डिजिटल उपकरण निगम पीडीपी -6 / 10
  • आईबीएम 701/704/709/7090/7094
  • UNIVAC 1103 / 1103A / 1105/1100/2200,

7
इसके अलावा हनीवेल मशीनें, जैसे कि शायद दूसरी मशीन जहां सी को लागू किया गया था। K & R संस्करण 1. देखें
Windows प्रोग्रामर

5
दरअसल, दिसंबर -10 में 6-बिट पात्र भी थे - आप इनमें से 6 को 36-बिट शब्द (पूर्व-दिसंबर -10 प्रोग्रामर से बात करते हुए) में पैक कर सकते हैं

2
DEC-20 ने TOPS-20 O / S पर 36-बिट शब्द में प्रति 7-बिट ASCII वर्णों का इस्तेमाल किया।
डेविड आर ट्रिब्बल

3
इस आर्किटेक्चर पर यूनिकोड का समर्थन करने के लिए उस मजाक को वास्तव में लागू किया गया था।
जोशुआ

9
मैं कल्पना करता हूं कि ऑक्टल का उपयोग वास्तव में कभी किया गया था क्योंकि 3 ऑक्टल अंक बड़े करीने से 9-बिट बाइट का प्रतिनिधित्व करते हैं, ठीक वैसे ही जैसे हम आमतौर पर आज हेक्साडेसिमल का उपयोग करते हैं क्योंकि दो हेक्साडेसिमल अंक बड़े करीने से 8-बिट बाइट का प्रतिनिधित्व करते हैं।
bames53

18

जिनमें से कुछ मैं जानता हूँ:

  • DEC PDP-10: परिवर्तनशील, लेकिन अक्सर 7-बिट वर्णों को प्रति 36-बिट शब्द में 5 पैक किया जाता है, या 9 बिट वर्ण, 4 प्रति शब्द
  • नियंत्रण डेटा मेनफ्रेम (सीडीसी -6400, 6500, 6600, 7600, साइबर 170, साइबर 176 आदि) 6-बिट वर्ण, 10 प्रति 60-बिट शब्द पैक।
  • Unisys मेनफ्रेम: 9 बिट्स / बाइट
  • विंडोज सीई: बस `चार` प्रकार का समर्थन नहीं करता है - इसके बजाय 16-बिट wchar_t की आवश्यकता है

2
@ कुशल: मुझे पूरा यकीन है कि PDP-10 / DecSystem 10 / DecSystem 20 के लिए कम से कम एक (प्री-स्टैंडर्ड) C कंपाइलर था। मैं CDC मेनफ्रेम के लिए C कंपाइलर पर बहुत आश्चर्यचकित रहूंगा हालांकि (वे थे) मुख्य रूप से संख्यात्मक कार्यों के लिए उपयोग किया जाता है, इसलिए फोरट्रान संकलक वहां बड़ी चीज थी)। मुझे पूरा यकीन है कि दूसरों के पास सी कंपाइलर हैं।
जेरी कॉफिन

3
क्या विंडोज सीई कंपाइलर वास्तव में charप्रकार का समर्थन नहीं करता था ? मुझे पता है कि सिस्टम लाइब्रेरी ने स्ट्रिंग्स को लेने वाले फ़ंक्शंस के विस्तृत चार संस्करणों का ही समर्थन किया था, और कि WinCE के कम से कम कुछ संस्करणों ने एएनएसआई स्ट्रिंग फ़ंक्शंस जैसे स्ट्रेलेन को हटा दिया, ताकि आप चार स्ट्रिंग-हैंडलिंग कर सकें। लेकिन क्या यह वास्तव में एक चार प्रकार नहीं था? क्या थाsizeof(TCHAR) ? मॉलोक किस प्रकार लौटा? जावा byteप्रकार कैसे लागू किया गया था ?
स्टीव जेसोप

10
विंडोज सीई चार का समर्थन करता है, जो एक बाइट है। रिचर्ड पेनिंगटन के जवाब पर क्रेग मैकक्वीन की टिप्पणी देखें। विंडोज सीई में बाइट्स की जरूरत हर जगह और हर जगह होती है, चाहे वे हर जगह किसी भी आकार के हों।
विंडोज प्रोग्रामर

2
PDP-10 के लिए C के कम से कम दो कार्यान्वयन हैं (हैं?): KCC और gcc का एक पोर्ट ( pdp10.nocrew.org/gcc )।
एपीग्रामग्राम

3
C मानक 7-बिट वर्ण को 5 प्रति 36-बिट शब्द (जैसा कि आपने PDP-10 के लिए उल्लेख किया है) की अनुमति नहीं देगा, और न ही यह 6-बिट वर्णों की अनुमति देगा, जैसा कि आपने नियंत्रण डेटा मेनफ्रेम के लिए उल्लेख किया है। देखें parashift.com/c++-faq-lite/intrinsic-types.html#faq-26.6
केन ब्लूम

15

पूरी तरह से पोर्टेबल कोड जैसी कोई चीज नहीं है। :-)

हां, विभिन्न बाइट / चार आकार हो सकते हैं। हां, अत्यधिक असामान्य मूल्यों वाले प्लेटफार्मों के लिए C / C ++ कार्यान्वयन हो सकता है CHAR_BITऔर UCHAR_MAX। हां, कभी-कभी कोड लिखना संभव होता है जो चार आकार पर निर्भर नहीं करता है।

हालाँकि, लगभग कोई भी वास्तविक कोड स्टैंडअलोन नहीं है। उदाहरण के लिए, आप एक कोड लिख सकते हैं जो नेटवर्क को बाइनरी संदेश भेजता है (प्रोटोकॉल महत्वपूर्ण नहीं है)। आप उन संरचनाओं को परिभाषित कर सकते हैं जिनमें आवश्यक फ़ील्ड शामिल हैं। आपको इसे क्रमबद्ध करना है। बस बाइनरी को आउटपुट बफर में एक संरचना की नकल करना पोर्टेबल नहीं है: आमतौर पर आप न तो प्लेटफॉर्म के लिए बाइट ऑर्डर को जानते हैं, न ही संरचना के सदस्यों को संरेखित करते हैं, इसलिए संरचना केवल डेटा रखती है, लेकिन उस तरीके का वर्णन नहीं करती है जिस तरह से डेटा को क्रमबद्ध किया जाना चाहिए। ।

ठीक। आप बाइट क्रम परिवर्तनों को निष्पादित कर सकते हैं और संरचना सदस्यों (जैसे uint32_tया समान) memcpyको बफर में उपयोग करके स्थानांतरित कर सकते हैं । क्यों memcpy? क्योंकि बहुत सारे प्लेटफ़ॉर्म हैं जहां लक्ष्य-पता ठीक से संरेखित नहीं होने पर 32-बिट (16-बिट, 64-बिट - कोई अंतर नहीं) लिखना संभव नहीं है।

इसलिए, आपने पोर्टेबिलिटी हासिल करने के लिए पहले ही बहुत कुछ कर लिया है।

और अब अंतिम प्रश्न। हमारे पास एक बफर है। इससे डेटा टीसीपी / आईपी नेटवर्क को भेजा जाता है। ऐसा नेटवर्क 8-बिट बाइट्स मानता है। सवाल यह है: बफर किस प्रकार का होना चाहिए? यदि आपके चार्ट 9-बिट हैं? यदि वे 16-बिट हैं? 24? हो सकता है कि प्रत्येक चार्ट नेटवर्क पर भेजे गए 8-बिट बाइट से मेल खाता हो, और केवल 8 बिट्स का उपयोग किया जाता हो? या शायद कई नेटवर्क बाइट्स को 24/16/9-बिट वर्ण में पैक किया जाता है? यह एक सवाल है, और यह मानना ​​मुश्किल है कि एक ही जवाब है जो सभी मामलों में फिट बैठता है। लक्ष्य प्लेटफॉर्म के लिए बहुत सारी चीजें सॉकेट कार्यान्वयन पर निर्भर करती हैं।

तो, मैं किस बारे में बोल रहा हूं। आमतौर पर कोड कुछ हद तक पोर्टेबल आसानी से बनाया जा सकता है । यदि आप विभिन्न प्लेटफार्मों पर कोड का उपयोग करने की अपेक्षा करते हैं तो ऐसा करना बहुत महत्वपूर्ण है। हालांकि, उस उपाय से परे पोर्टेबिलिटी में सुधार एक ऐसी चीज है जिसके लिए बहुत प्रयास की आवश्यकता होती है और अक्सर बहुत कम देता है , क्योंकि वास्तविक कोड लगभग हमेशा अन्य कोड (ऊपर उदाहरण में सॉकेट कार्यान्वयन) पर निर्भर करता है। मुझे यकीन है कि 8-बिट के अलावा बाइट्स के साथ प्लेटफार्मों पर काम करने की लगभग 90% कोड क्षमता लगभग बेकार है, क्योंकि यह पर्यावरण का उपयोग करता है जो 8-बिट के लिए बाध्य है। बस बाइट आकार की जाँच करें और संकलन समय की पुष्टि करें। आपको लगभग निश्चित रूप से एक अत्यधिक असामान्य मंच के लिए बहुत कुछ फिर से लिखना होगा।

लेकिन अगर आपका कोड अत्यधिक "स्टैंडअलोन" है - क्यों नहीं? आप इसे एक तरह से लिख सकते हैं जो विभिन्न बाइट आकारों की अनुमति देता है।


4
यदि कोई एक ऑक्टेट प्रति unsigned charमान संग्रहीत करता है, तो पोर्टेबिलिटी की समस्या नहीं होनी चाहिए जब तक कि कोड ऑल्टिंग ट्रिक का उपयोग न करके शिफ्ट के बजाय ऑक्टेट के अनुक्रमों को बड़े पूर्णांक प्रकारों से / बदल दें। व्यक्तिगत रूप से, मुझे लगता है कि सी मानक को आंतरिक प्रकारों को छोटे प्रकारों के अनुक्रमों से पैक / अनपैक करने के लिए परिभाषित करना चाहिए (सबसे आम तौर पर char) एक निश्चित गारंटीकृत-उपलब्ध बिट्स प्रति आइटम (8 प्रति unsigned char, 16 प्रति unsigned shortया 32 प्रति unsigned long)।
सुपरकैट



5

उदाहरण के लिए, C और C ++ प्रोग्रामिंग लैंग्वेज, बाइट को "निष्पादन योग्य वातावरण के मूल चरित्र सेट के किसी भी सदस्य को पकड़ने के लिए डेटा की पता करने योग्य इकाई" के रूप में परिभाषित करती है। (C मानक का खंड 3.6)। चूंकि सी चार अभिन्न डेटा प्रकार में कम से कम 8 बिट्स (क्लॉज 5.2.4.2.1) होना चाहिए, सी में एक बाइट कम से कम 256 विभिन्न मूल्यों को धारण करने में सक्षम है। C और C ++ के विभिन्न कार्यान्वयन 8, 9, 16, 32 या 36 बिट्स के रूप में एक बाइट को परिभाषित करते हैं

Http://en.wikipedia.org/wiki/Byte#History से उद्धृत

हालांकि अन्य भाषाओं के बारे में निश्चित नहीं है।

http://en.wikipedia.org/wiki/IBM_7030_Stretch#Data_Formats

चर लंबाई होने के लिए उस मशीन पर एक बाइट को परिभाषित करता है


1
"हालांकि अन्य भाषाओं के बारे में निश्चित नहीं है" - ऐतिहासिक रूप से, अधिकांश भाषाओं ने मशीन की वास्तुकला को अपने बाइट के आकार को परिभाषित करने की अनुमति दी। वास्तव में ऐतिहासिक रूप से ऐसा C किया गया था, जब तक कि मानक निम्न सीमा 8 पर सेट नहीं हो जाता
विंडोज प्रोग्रामर

4

DEC PDP-8 परिवार में एक 12 बिट शब्द था, हालांकि आप आमतौर पर आउटपुट के लिए 8 बिट ASCII का उपयोग करते थे (अधिकतर टेलेटाइप पर)। हालाँकि, एक 6-BIT वर्ण कोड भी था जिसने आपको एक 12-बिट शब्द में 2 वर्णों को एन्कोड करने की अनुमति दी थी।


3

एक के लिए, यूनिकोड वर्ण 8-बिट से अधिक लंबे होते हैं। जैसा कि किसी ने पहले उल्लेख किया है, सी कल्पना उनके न्यूनतम आकारों द्वारा डेटा प्रकारों को परिभाषित करती है। sizeofमें मानों का उपयोग करेंlimits.hयदि आप अपने डेटा प्रकारों से पूछताछ करना चाहते हैं तो पता करें कि वे आपके कॉन्फ़िगरेशन और वास्तुकला के लिए किस आकार के हैं।

इस कारण से, मैं डेटा प्रकारों से चिपके रहने की कोशिश करता uint16_tहूं जब मुझे किसी विशेष बिट लंबाई के डेटा प्रकार की आवश्यकता होती है।

संपादित करें: क्षमा करें, मैंने शुरू में आपके प्रश्न को गलत बताया।

सी स्पेक कहता है कि एक charऑब्जेक्ट "निष्पादन वर्ण सेट के किसी भी सदस्य को संग्रहीत करने के लिए पर्याप्त बड़ा है"। limits.h8 बिट्स के एक न्यूनतम आकार को सूचीबद्ध करता है, लेकिन परिभाषा एक charखुले के अधिकतम आकार को छोड़ देती है ।

इस प्रकार, ए charकम से कम तब तक है जब तक कि आपके आर्किटेक्चर के निष्पादन सेट से सबसे बड़ा चरित्र (आमतौर पर निकटतम 8-बिट सीमा तक गोल हो)। यदि आपकी वास्तुकला में अधिक समय है, तो आपकीchar आकार लंबा हो सकता है।

ऐतिहासिक रूप से, x86 प्लेटफ़ॉर्म का ओपोड एक बाइट लंबा charथा , इसलिए शुरू में 8-बिट मूल्य था। वर्तमान x86 प्लेटफ़ॉर्म एक बाइट से अधिक समय तक opcodes का समर्थन करता है, लेकिन इसे char8 बिट्स की लंबाई पर रखा जाता है क्योंकि यह प्रोग्रामर (और मौजूदा x86 कोड के बड़े वॉल्यूम) के लिए वातानुकूलित हैं।

मल्टी-प्लेटफ़ॉर्म समर्थन के बारे में सोचते समय, परिभाषित प्रकारों का लाभ उठाएं stdint.h। यदि आप (उदाहरण के लिए) एक uint16_t उपयोग करते हैं, तो आप यकीन है कि यह मूल्य एक है कि क्या है कि 16-बिट मूल्य मेल खाती है, जो कुछ भी वास्तुकला पर एक अहस्ताक्षरित 16-बिट मूल्य है हो सकता है char, short, int, या कुछ और। अधिकांश परिश्रम उन लोगों द्वारा पहले ही किया जा चुका है, जिन्होंने आपके संकलक / मानक पुस्तकालय लिखे हैं।

यदि आपको एक सटीक आकार जानने की आवश्यकता है charक्योंकि आप कुछ निम्न-स्तरीय हार्डवेयर हेरफेर कर रहे हैं जिसकी आवश्यकता है, तो मैं आमतौर पर एक डेटा प्रकार का उपयोग करता हूं जो charसभी समर्थित प्लेटफार्मों पर पकड़ के लिए पर्याप्त है (आमतौर पर 16 बिट्स पर्याप्त है) और चलाएं एक convert_to_machine_charमशीन के माध्यम से मूल्य जब मुझे सटीक मशीन प्रतिनिधित्व की आवश्यकता होती है। इस तरह, प्लेटफ़ॉर्म-विशिष्ट कोड इंटरफ़ेस फ़ंक्शन तक ही सीमित है और अधिकांश समय मैं एक सामान्य का उपयोग कर सकता हूं uint16_t


2
सवाल चरित्रों (यूनिकोड या नहीं) के बारे में नहीं पूछा। इसने चार के बारे में पूछा, जो एक बाइट है।
विंडोज प्रोग्रामर

1
इसके अलावा, निष्पादन चरित्र सेट का ओपकोड के साथ कोई लेना-देना नहीं है, यह निष्पादन पर इस्तेमाल किया जाने वाला चरित्र सेट है, क्रॉस-कंपाइलर के बारे में सोचें।
निंजाल

"ऐतिहासिक रूप से, x86 प्लेटफॉर्म का ओपोड एक बाइट लंबा था": कितना प्यारा। ऐतिहासिक रूप से , C को PDP-11 (1972) में विकसित किया गया था, बहुत पहले x86 का आविष्कार किया गया था (1978)।
मार्टिन बोनर

3

गैर-8-बिट चार्ट वाले प्लेटफार्मों को देने के लिए किस प्रकार का विचार है?

जादू की संख्याएँ घटित होती हैं जैसे कि स्थानांतरण;

इनमें से अधिकांश को 8 और 255 (या समान) के बजाय CHAR_BIT और उदा UCHAR_MAX का उपयोग करके बहुत आसानी से नियंत्रित किया जा सकता है।

उम्मीद है कि आपका कार्यान्वयन उन को परिभाषित करता है :)

उन "आम" मुद्दे हैं .....

एक और अप्रत्यक्ष मुद्दा यह है कि आपके पास है:

struct xyz {
   uchar baz;
   uchar blah;
   uchar buzz; 
}

यह एक मंच पर "केवल" ले (सबसे अच्छा मामला) 24 बिट्स हो सकता है, लेकिन कहीं और 72 बिट्स ले सकता है .....

यदि प्रत्येक uchar में "बिट फ़्लैग" होते हैं और प्रत्येक uchar में केवल 2 "महत्वपूर्ण" बिट्स या फ़्लैग होते हैं जिन्हें आप वर्तमान में उपयोग कर रहे थे, और आपने उन्हें केवल "स्पष्टता" के लिए 3 uchar में व्यवस्थित किया, तो यह अपेक्षाकृत अधिक "बेकार" हो सकता है जैसे कि " 24-बिट uchars के साथ एक मंच .....

कुछ भी नहीं हल कर सकते हैं, लेकिन वे अन्य चीजों के लिए बाहर देखने के लिए है ...।

इस मामले में, केवल एक एनम "सबसे छोटा" आकार पूर्णांक प्राप्त करने का एक तरीका हो सकता है जिसकी आपको वास्तव में आवश्यकता है ...।

शायद एक वास्तविक उदाहरण नहीं है, लेकिन कुछ कोड के साथ पोर्टिंग / प्ले करते समय मुझे इस "बिट" की तरह सामान .....

बस इस तथ्य से कि अगर एक uchar तीन बार उतना बड़ा हो जो "सामान्य रूप से" अपेक्षित हो, तो 100 ऐसी संरचनाएं कुछ प्लेटफार्मों पर बहुत सारी मेमोरी बर्बाद कर सकती हैं ..... जहां "सामान्य रूप से" यह एक बड़ी बात नहीं है ...। ।

इसलिए चीजें अभी भी "टूटी हुई" हो सकती हैं या इस मामले में "बहुत स्मृति को बहुत जल्दी बर्बाद कर देती है" एक धारणा के कारण कि एक मंच पर एक uchar "बहुत बेकार नहीं" है, रैम के सापेक्ष उपलब्ध है, दूसरे मंच की तुलना में ... ..

समस्या अधिक प्रमुख हो सकती है जैसे कि ints के लिए, या अन्य प्रकार, जैसे कि आपके पास कुछ संरचना है, जिसमें 15 बिट्स की आवश्यकता होती है, इसलिए आप इसे इंट में चिपकाते हैं, लेकिन किसी अन्य प्लेटफॉर्म पर एक इंट 48 बिट्स या जो भी हो ...। ।

"सामान्य रूप से" आप इसे 2 uchars में तोड़ सकते हैं, लेकिन उदाहरण के लिए एक 24-बिट uchar के साथ आपको केवल एक की आवश्यकता होगी .....

तो एक एनम एक बेहतर "सामान्य" समाधान हो सकता है ...।

हालांकि आप उन बिट्स तक कैसे पहुंच रहे हैं, इस पर निर्भर करता है :)

इसलिए, "डिज़ाइन दोष" हो सकते हैं जो उनके सिर को पीछे करते हैं .... भले ही कोड अभी भी काम कर सकता है / एक uchar या uint के आकार की परवाह किए बिना ठीक चल सकता है ...

देखने के लिए इस तरह की चीजें हैं, भले ही आपके कोड में "मैजिक नंबर" न हों ...

आशा है कि यह समझ में आता है :)


1
...क्या? आपको क्या लगता enumहै कि अन्य देशी प्रकारों की तुलना में छोटा होने की संभावना है? क्या आप जानते हैं कि यह उसी भंडारण के लिए चूक है int? "आपके पास कुछ संरचना है जिसमें 15 बिट्स की आवश्यकता होती है, इसलिए आप इसे एक इंट में चिपका देते हैं, लेकिन किसी अन्य प्लेटफॉर्म पर एक इंट 48 बिट्स या जो कुछ भी है ....." - तो #include <cstdint>और इसे int16_tबिट उपयोग को न्यूनतम करने के सर्वोत्तम अवसर के लिए बनाएं। । मुझे वास्तव में यकीन नहीं है कि आपने क्या सोचा था कि आप उन सभी ग्रहणों के बीच कह रहे थे।
अंडरस्कोर_ड

1

इनट्स 16 बिट्स (pdp11, आदि) हुआ करते थे। 32 बिट आर्किटेक्चर में जाना कठिन था। लोग बेहतर हो रहे हैं: शायद ही कोई मानता है कि कोई संकेतक लंबे समय तक फिट होगा (आप सही नहीं है?)। या फाइल ऑफ़सेट, या टाइमस्टैम्प, या ...

8 बिट अक्षर पहले से ही कुछ हद तक एक एंकरोनिज़्म के हैं। दुनिया के सभी कैरेक्टर सेट को पकड़ने के लिए हमें पहले से ही 32 बिट्स की जरूरत है।


2
सच। charयूनिकोड के दिनों में नाम थोड़ा विचित्र है। बाइनरी डेटा, जैसे फ़ाइल भंडारण, नेटवर्क संचार के साथ काम करते समय मुझे 8-बिट इकाइयों (ओकटेट्स) की अधिक परवाह है। uint8_tअधिक उपयोगी है।
क्रेग मैकक्यून

3
यूनिकोड को वास्तव में पूर्ण 32 बिट्स की आवश्यकता नहीं थी। उन्होंने मूल रूप से 31 के लिए योजना बनाई (मूल UTF-8 काम देखें), लेकिन अब वे केवल 21 बिट्स के साथ संतुष्ट हैं । उन्हें शायद एहसास हुआ कि वे किताब को नहीं छाप पाएंगे, अगर उन्हें वास्तव में सभी 31 बिट्स की जरूरत है: P
me22

2
@ me22, यूनिकोड मूल रूप से 16 बिट्स के लिए योजना बनाई गई थी। "यूनिकोड अक्षर भाषा की परवाह किए बिना लगातार 16 बिट्स चौड़े हैं ..." यूनिकोड 1.0.0। unicode.org/versions/Unicode1.0.0/ch01.pdf
शैनन सेवरेंस

1
आईएसओ 10646 मूल रूप से 31 बिट्स था, और यूनिकोड का आईएसओ 10646 के साथ विलय हो गया, इसलिए यह कहना टेढ़ा हो सकता है कि यूनिकोड 31 बिट्स था, लेकिन यह वास्तव में असत्य नहीं है। ध्यान दें कि वे वास्तव में पूर्ण कोड तालिकाओं को किसी भी अधिक प्रिंट नहीं करते हैं।
अभियोजन पक्ष
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.