क्या ऐसी मशीनें हैं, जहाँ sizeof (char)! = 1, या कम से कम CHAR_BIT> 8?


93

क्या मशीनें (या संकलक) हैं, कहां हैं sizeof(char) != 1?

क्या C99 मानक कहता है कि sizeof(char)मानक अनुपालन कार्यान्वयन पर MUST बिल्कुल 1 होना चाहिए? यदि ऐसा होता है, तो कृपया मुझे अनुभाग संख्या और उद्धरण दें।

अद्यतन: यदि मेरे पास एक मशीन (सीपीयू) है, जो बाइट्स को संबोधित नहीं कर सकता है (न्यूनतम रीड 4 बाइट्स, संरेखित है), लेकिन केवल 4-एस बाइट्स ( uint32_t), इस मशीन के लिए कंपाइलर sizeof(char)4 को परिभाषित कर सकता है? sizeof(char)1 होगा, लेकिन चार में 32 बिट्स होंगे ( CHAR_BITमैक्रोज़)

Update2: लेकिन sizeof परिणाम एक BYTES नहीं है! यह CHAR के आकार का है। और चार बाइट हो सकती है, या (हो सकती है) 7 बिट?

अपडेट 3: ठीक है। सभी मशीनों में है sizeof(char) == 1। लेकिन क्या मशीनें हैं CHAR_BIT > 8?


4
मैं C99 मानक-अनुपालन में चिंतित हूं। मैं C99 संकलक के साथ मिलकर काम करता हूं
ऑगसक्स

2
जैसा कि यूनिकोड और भी महत्वपूर्ण हो जाता है, ऐसे गैर-मानक संकलक आ सकते हैं जो यूनिकोड वर्णों का उपयोग करते हैं char(इसके बजाय wchar।) यदि मानक कहता है कि sizeof(char)1 होना चाहिए, तो मैं उस धारणा पर निर्भर नहीं होता।
चिप यूनी

14
कोई C कंपाइलर नहीं है जहाँ sizeof (char) 1, यूनिकोड या नहीं है।
न।

6
@ चिप: sizeof(char)हमेशा 1 है, भले ही चार-बिट्स हो (जैसा कि कुछ सिस्टम पर होता है)। C में बहुत सारे मौसा मौसा हैं।
निक बैस्टिन

2
C मानक के सभी संस्करणों को CHAR_BIT कम से कम 8 होना चाहिए; आपके पास CHAR_BIT == 7 नहीं हो सकता है और मानक अनुरूप हो सकता है। हालाँकि, मशीनों के लिए CHAR_BIT> 8 होना पूरी तरह से संभव है। 8. पुरानी क्रे मशीनों ने किया, मुझे विश्वास है ( sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int)उन पर; मुझे याद नहीं है कि sizeof(int) == sizeof(long)क्या CHAR_BIT 32 या 64 था; मुझे उम्मीद है कि यह 32 था, और मुझे sizeof(long) == 1भी लगता है। (आप के लिए एक संदर्भ प्राप्त कर सकते हैं, लेकिन करने के लिए, एक नहीं ऑनलाइन पहुँच क्रे सी पुस्तिका )।
जोनाथन Leffler

जवाबों:


91

यह हमेशा C99, खंड 6.5.3.4 में एक होता है:

जब एक ऐसे ऑपरेंड पर लागू किया जाता है जिसमें टाइप चार, अहस्ताक्षरित चार या हस्ताक्षरित चार, (या एक योग्य संस्करण) होता है, तो परिणाम 1 होता है।

संपादित करें: आपके प्रश्न का हिस्सा नहीं है, लेकिन हार्बिसन और स्टील, 3 एड से ब्याज के लिए। (पूर्व c99) पी। 148:

एक भंडारण इकाई को एक पात्र के कब्जे वाली भंडारण की मात्रा के रूप में लिया जाता है; इस प्रकार की किसी वस्तु का आकार char1 है।

संपादित करें: आपके अपडेट किए गए प्रश्न के उत्तर में, हार्बिसन और स्टील से निम्नलिखित प्रश्न और उत्तर प्रासंगिक है (ibid, Ch। 6 का Ex। 4)।

क्या सी लागू होने की अनुमति है, जिसमें टाइप char2,147,483,647 के माध्यम से -2,147,483,648 से मानों का प्रतिनिधित्व कर सकता है? यदि हां, तो sizeof(char) उस कार्यान्वयन के तहत क्या होगा ? प्रकार की सबसे छोटी और सबसे बड़ी श्रृंखला कौन सी होगी int?

उत्तर (ibid, पृष्ठ 382):

इसे लागू करने के लिए अनुमति दी जाती है (यदि व्यर्थ है) प्रकार का प्रतिनिधित्व करने के लिए 32 बिट्स का उपयोग करने के लिए char। कार्यान्वयन के बावजूद, मूल्य sizeof(char)हमेशा 1 होता है।

हालांकि यह विशेष रूप से एक मामले को संबोधित नहीं करता है, जहां बाइट्स 8 बिट्स हैं और charउन बाइट्स में से 4 हैं (वास्तव में c99 परिभाषा के साथ असंभव है, नीचे देखें), तथ्य यह है कि sizeof(char) = 1हमेशा c99 मानक और हार्बिसन और स्टील से स्पष्ट है।

संपादित करें: वास्तव में (यह आपके अपडेट 2 सवाल के जवाब में है), जहां तक ​​c99 का संबंध sizeof(char) है बाइट्स में, खंड 6.5.3.4 से फिर से:

आकारऑपर ऑपरेटर अपने ऑपरेंड के आकार (बाइट्स में) का उत्पादन करता है

तो ऊपर दिए गए उद्धरण के साथ संयुक्त, 8 बिट्स और char4 बाइट्स के बाइट के रूप में असंभव है: c99 के लिए एक बाइट एक के रूप में ही है char

7 बिट की संभावना के आपके उल्लेख के जवाब में char: यह c99 में संभव नहीं है। मानक के खंड 5.2.4.2.1 के अनुसार न्यूनतम 8 है:

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

- सबसे छोटी वस्तु के लिए बिट्स की संख्या जो बिट-फिल्ड नहीं है (बाइट)

 **CHAR_BIT 8**

- हस्ताक्षरित चार प्रकार की वस्तु के लिए न्यूनतम मूल्य

**SCHAR_MIN -127//−(27−1)** 

- हस्ताक्षरित चार प्रकार की वस्तु के लिए अधिकतम मूल्य

**SCHAR_MAX +127//27−1** 

- प्रकार अहस्ताक्षरित चार की एक वस्तु के लिए अधिकतम मूल्य

**UCHAR_MAX 255//28−1** 

- प्रकार चार के ऑब्जेक्ट के लिए न्यूनतम मूल्य

**CHAR_MIN**    see below 

- टाइप चार के ऑब्जेक्ट के लिए अधिकतम मूल्य

**CHAR_MAX**    see below

[...]

यदि अभिव्यक्ति में उपयोग किए जाने पर किसी प्रकार के ऑब्जेक्ट के मूल्य को एक हस्ताक्षरित पूर्णांक के रूप में माना जाता है, तो CHAR_MIN का मूल्य SCHAR_MIN के समान होगा और CHAR_MAX का मूल्य SCHAR_MAX के समान होगा। अन्यथा, CHAR_MIN का मान 0 होगा और CHAR_MAX का मूल्य UCHAR_MAX के समान होगा। UCHAR_MAX का मान 2 ^ CHAR_BIT - 1 के बराबर होगा।


9
अतिरिक्त नोट। एक CHAR_BITS मैक्रो है जो आपको बताएगा कि आपके चार्ट कितने बिट्स हैं।
न।

1
इस महान पुस्तक का पूरा डेटा हैरिसन और स्टील का है। सी: ए रेफरेंस मैनुअल, थर्ड एडिशन, अप्रेंटिस हॉल, १ ९९ १
ऑगक्स

2
यदि आप जानते हैं कि आप चार प्रकारों के साथ काम कर रहे हैं और आप जानते हैं कि भाषा के लिए उन्हें 1 के आकार की आवश्यकता होती है, तो हमेशा निरर्थक आकार (चार) क्यों रखना एक अच्छा विचार है?

1
(ए) और (सी) में बहुत अधिक गंभीर प्रभाव हैं जो इसे हल करने की उम्मीद नहीं कर सकते हैं, या हल करने के करीब भी पहुंच सकते हैं; YAGNI भी। (बी) के रूप में किसी को सिर्फ एक बार कहा जाना चाहिए --- मुझे अपने कोड की प्रत्येक पंक्ति में उन्हें सिखाने की आवश्यकता नहीं है। हालांकि, उपयोग करने में कमियां हैं sizeof(char): यह बहस / जांच / आदि के लिए एक और आइटम है। आपके कोडिंग सम्मेलनों / मानकों / दिशानिर्देशों में, मेरे समय को आश्चर्यचकित करता है कि क्या आप वास्तव में सी जानते हैं और क्या गलत हो सकता है, दृश्य / मानसिक / पाठ-लाइन "बैंडविड्थ" को लेता है।

1
@ रामाशालंका: हां, संकलित कोड समकक्ष है। यह पठनीयता के आसपास के सभी मुद्दे हैं और अन्यथा लोग उस स्रोत कोड का उपयोग कैसे करते हैं जिसके बारे में मैं बात कर रहा हूं। (और एफडब्ल्यूआईडब्ल्यू, मुझे लगता है कि आपके पास यहां एक सभ्य +1 जवाब है, मैं सिर्फ "हमेशा आकार का उपयोग करें (चार)" गुमराह होने के लिए और मेरे लिए एक हॉटबटन मुद्दा उपयोग करता हूं, भले ही एक छोटा मुद्दा हो।)

21

ऐसी कोई मशीन नहीं है जहाँ sizeof(char)4 है। यह हमेशा 1 बाइट होती है। उस बाइट में 32 बिट्स हो सकते हैं, लेकिन जहां तक ​​सी कंपाइलर की बात है, यह एक बाइट है। अधिक जानकारी के लिए, मैं वास्तव में आपको C ++ FAQ 26.6 पर इंगित करने जा रहा हूं । यह लिंक इसे बहुत अच्छी तरह से कवर करता है और मुझे C से उन नियमों के बारे में काफी कुछ पता है। C आप 8 बिट्स से बड़े अक्षरों के लिए comp.lang.c FAQ 8.10 भी देख सकते हैं ।

Update2: लेकिन sizeof परिणाम एक BYTES नहीं है! यह CHAR के आकार का है। और चार बाइट हो सकती है, या (हो सकती है) 7 बिट?

हाँ, यह बाइट्स है। मुझे ये फिर से कहने दो. sizeof(char)C संकलक के अनुसार 1 बाइट है। क्या लोग बोलचाल की भाषा में बाइट (8 बिट) कहते हैं जरूरी नहीं कि सी कंपाइलर एक बाइट कहे। C बाइट में बिट्स की संख्या आपके मशीन आर्किटेक्चर के आधार पर भिन्न होती है। यह भी कम से कम 8 होने की गारंटी है।


3
कृप्या!!! C ++, C (C99) से वास्तव में अलग भाषा है। यह सवाल केवल सादे सी के बारे में है।
2

स्ट्राइक> मैं क्या कर सकता हूं जब मशीन / सीपीयू 8-बिट बाइट्स तक नहीं पहुंच सकता है? अहस्ताक्षरित प्रवेश निषिद्ध है। </ हड़ताल> (x86 मॉलॉक पर भी डेटा संरेखित करता है और 4 बाइट्स के गुणकों में मेमोरी आवंटित करता है।) <स्ट्राइक> तो CHAT_BIT 8 से अधिक होगा। हां, ऐसा प्लेटफॉर्म विशेष रूप से </ हड़ताल हो सकता है। >
2

10
@osgx, मैं उतना ही चिल्लाता हूं जितना आपने किया था जब लोग C और C ++ को मिलाने की कोशिश करते थे। लेकिन मुझे लगता है कि इस मामले में एक सी ++ एफएक्यू प्रविष्टि सी
माइकल क्रिस्टोफ़िक

3
"8 बिट्स" का सही नाम ऑक्टेट है। सी स्टैंडर्ड एक ऑब्जेक्ट के लिए "बाइट" शब्द का उपयोग करता है जो एक चार का आकार है। अन्य लोग "बाइट" शब्द का उपयोग अलग-अलग तरीकों से कर सकते हैं, अक्सर जब उनका अर्थ "ओक्टेट" होता है, लेकिन सी (और सी ++, या ऑब्जेक्टिव-सी) में इसका मतलब है "ऑब्जेक्ट एक चार का आकार"। एक चर 8 बिट्स या एक से अधिक ऑक्टेट का हो सकता है, लेकिन यह हमेशा एक बाइट होता है।
gnasher729

9

पीडीपी -10 और पीडीपी -11 था।

अपडेट: PDP-10 के लिए कोई C99 कंपाइलर नहीं है।

एनालॉग डिवाइस 32-बिट SHARC DSP के कुछ मॉडलों में CHAR_BIT = 32 और टेक्सास इंस्ट्रूमेंट्स DSP से TMS32F28xx के CHAR_BIT = 16 हैं, कथित तौर पर

अपडेट: CHAR_BIT = 9 के साथ पीडीपी -10 के लिए GCC 3.2 है (उस संग्रह में शामिल / सीमाएं देखें)।


1
सी के समान-लेकिन-नहीं-सी भाषाओं के कार्यान्वयन को भ्रमित न करें। आपने यहां तक ​​कहा कि "मैं C99 मानक-अनुपालन में चिंतित हूं। मैं C99 कंपाइलर के साथ मिलकर काम करता हूं।"

2
@Roger: GCC3 को C99 कंप्लेंट नहीं कहना उचित नहीं है जब तक कि आप चरम एज के मामलों से निपट नहीं रहे हैं जिन्हें GCC में बग माना जाता है।
जोशुआ

1
@ जोशुआ, मुझे लगता है कि रोजर केएंडआर के बारे में कहते हैं और ऐतिहासिक संकलक को आगे बढ़ाते हैं। C99 अनुपालन परीक्षण से पहले C99 के अनुपालन का दावा करने के लिए भी उचित नहीं है, PDP-10 पर चलाया जाता है, जब इस पोर्ट के साथ संकलित किया जाता है (पोर्टिंग से और मशीन से ही कीड़े हो सकते हैं)। लेकिन यह C86 मानक के करीब होने की उम्मीद की जा सकती है क्योंकि x86 पर GCC3.2 है।
osgx

1
@ जोशुआ: CHAR_BIT की अनुमति C99 में, 8 से अधिक होने की है, लेकिन साइज़ोफ़ (चार) अभी भी 1 होना चाहिए (और यह जवाब बहुत अलग था जब मैंने वह टिप्पणी छोड़ दी)। मैं GCC3 को गैर-आज्ञाकारी नहीं कह रहा हूं, और C89 यहां बीटीडब्ल्यू को समान आवश्यकता बनाता है। मैंने उस पाठ को यह कहने के लिए उद्धृत किया कि osgx C99 अनुपालन के बारे में चिंतित है और C99 संकलक का उपयोग करता है, इसलिए वह गैर-C99 संकलक के बारे में चिंतित क्यों है?

2
पीडीपी -10 जीसीसी के लेखक यहां। CHAR_BIT 9 है, लेकिन साइज़ोफ़ (चार) अभी भी 1. है
लार्स ब्रिंकहॉफ़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.