वर्णों के बजाय C वर्ण शाब्दिक जड़ क्यों हैं?


103

C ++ में, sizeof('a') == sizeof(char) == 1। यह सहज ज्ञान युक्त है, क्योंकि 'a'एक चरित्र शाब्दिक है, और sizeof(char) == 1जैसा कि मानक द्वारा परिभाषित किया गया है।

सी में, तथापि sizeof('a') == sizeof(int)। यही है, यह प्रतीत होता है कि सी वर्ण शाब्दिक वास्तव में पूर्णांक हैं। क्या किसी को पता है क्यों? मैं इस सी क्वर्की के बहुत सारे उल्लेख पा सकता हूं लेकिन इसका कोई स्पष्टीकरण नहीं है कि यह क्यों मौजूद है।


sizeof बस एक बाइट के आकार वापस आ जाएगी यह नहीं होगा? एक चार और आकार में एक समान नहीं हैं?
जोश स्मेटन

1
यह संभवतः संकलक (और वास्तुकला) पर निर्भर है। यह कहने के लिए परवाह करें कि आप क्या उपयोग कर रहे हैं? मानक (कम से कम '89 तक) बहुत ढीला था।
dmckee --- पूर्व-मध्यस्थ ने बिल्ली का बच्चा

2
नहीं। एक चर हमेशा 1 बाइट बड़ा होता है, इसलिए आकार ('ए') == 1 हमेशा (सी ++ में), जबकि एक इंट सैद्धांतिक रूप से 1 का आकार हो सकता है, लेकिन इसके लिए कम से कम 16 बिट वाले बाइट की आवश्यकता होगी, जो बहुत संभावना नहीं है: ) तो साइज़ोफ़ ('ए')! = साइज़ोफ़ (इंट) अधिकांश कार्यान्वयनों में सी ++ में बहुत संभावना है
जोहान्स स्काउब -

2
... जबकि यह हमेशा सी में गलत है
जोहान्स स्काउब -

22
'a' C - अवधि में एक int है। C पहले वहां पहुंचा - C ने नियम बनाए। C ++ ने नियम बदले। आप तर्क दे सकते हैं कि C ++ के नियम अधिक मायने रखते हैं, लेकिन C नियमों को बदलने से अच्छे से अधिक नुकसान होगा, इसलिए C मानक समिति ने समझदारी से इसे छुआ नहीं है।
जोनाथन लेफलर

जवाबों:


36

उसी विषय पर चर्चा

"अधिक विशेष रूप से अभिन्न प्रचार। K & R C में यह वस्तुतः (?) असंभव था एक चरित्र मूल्य का उपयोग करने के लिए बिना इसे पहले int के लिए बढ़ावा दिया जा रहा था, इसलिए पहली जगह में चरित्र को निरंतर int बनाने से उस चरण को समाप्त कर दिया गया था और अभी भी बहु चरित्र हैं। कॉन्स्टेंट जैसे कि 'एबीसीडी' या फिर कई एक इंट में फिट होंगे। "


मल्टी-कैरेक्टर कॉन्स्टेंट पोर्टेबल नहीं होते हैं, यहां तक ​​कि एक मशीन पर कंपाइलर के बीच भी (हालांकि जीसीसी प्लेटफॉर्म पर आत्मनिर्भर लगता है)। देखें: stackoverflow.com/questions/328215
जोनाथन लेफ़्लर

8
मैं यह नोट करूंगा कि क) यह उद्धरण अप्राप्य है; प्रशस्ति पत्र केवल कहता है "क्या आप इस राय से असहमत होंगे, जो पिछले धागे में पोस्ट किया गया था जो सवाल में इस मुद्दे पर चर्चा कर रहा है?" ... और ख) यह एक प्रकार का वृक्ष है , क्योंकि एक charचर एक int नहीं है, इसलिए एक चरित्र को स्थिर बनाना एक विशेष मामला है। और इसे बढ़ावा दिए बिना चरित्र मूल्य का उपयोग करना आसान है c1 = c2;:। OTOH, c1 = 'x'एक डाउनवर्ड रूपांतरण है। सबसे महत्वपूर्ण, sizeof(char) != sizeof('x')जो गंभीर भाषा बॉट है। मल्टीबाइट चरित्र स्थिरांक के रूप में: वे कारण हैं, लेकिन वे अप्रचलित हैं।
जिम बैटर

27

मूल प्रश्न "क्यों?"

कारण यह है कि एक शाब्दिक चरित्र की परिभाषा विकसित हुई है और बदल गई है, जबकि मौजूदा कोड के साथ संगत रहने की कोशिश कर रहा है।

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

इसका मतलब यह है कि जब आप फ़ंक्शन लिख रहे थे, तो सभी पैरामीटर जो डबल नहीं थे, उन्हें स्टैक पर किट्स के रूप में संग्रहीत किया गया था, चाहे आपने उन्हें कैसे घोषित किया हो, और संकलक ने आपके लिए इसे संभालने के लिए फ़ंक्शन में कोड डाला।

इससे चीजें कुछ असंगत हो गईं, इसलिए जब K & R ने अपनी प्रसिद्ध पुस्तक लिखी, तो उन्होंने यह नियम रखा कि एक चरित्र शाब्दिक को हमेशा किसी फ़ंक्शन में नहीं, बल्कि किसी भी अभिव्यक्ति में एक इंट को बढ़ावा दिया जाएगा।

जब एएनएसआई समिति ने पहली बार सी का मानकीकरण किया, तो उन्होंने इस नियम को बदल दिया ताकि एक चरित्र शाब्दिक रूप से एक अंतर हो, क्योंकि यह एक ही चीज़ को प्राप्त करने का एक सरल तरीका लग रहा था।

जब C ++ को डिज़ाइन किया जा रहा था, तो सभी फ़ंक्शन को पूर्ण प्रोटोटाइप होने की आवश्यकता थी (यह अभी भी C में आवश्यक नहीं है, हालांकि इसे सार्वभौमिक रूप से अच्छे अभ्यास के रूप में स्वीकार किया जाता है)। इस वजह से, यह तय किया गया था कि एक चरित्र शाब्दिक एक चार में संग्रहीत किया जा सकता है। C ++ में इसका लाभ यह है कि चार पैरामीटर के साथ एक फ़ंक्शन और एक अंतर पैरामीटर वाले फ़ंक्शन पर अलग-अलग हस्ताक्षर होते हैं। यह लाभ सी में मामला नहीं है।

यही कारण है कि वे अलग हैं। क्रमागत उन्नति...


2
मेरे लिए +1 वास्तव में 'क्यों?' का उत्तर देने के लिए। लेकिन मैं अंतिम कथन से असहमत हूं - "C ++ में इसका लाभ यह है कि एक चार पैरामीटर के साथ एक फ़ंक्शन और एक अंतर पैरामीटर के साथ एक फ़ंक्शन में अलग-अलग हस्ताक्षर हैं" - C ++ में 2 फ़ंक्शन के मापदंडों के लिए अभी भी संभव है एक ही आकार और विभिन्न हस्ताक्षर, जैसे void f(unsigned char)बनाम void f(signed char)
पीटर के

3
@PeterK जॉन इसे बेहतर बना सकता था, लेकिन वह जो कहता है वह अनिवार्य रूप से सटीक है। C ++ में परिवर्तन की प्रेरणा थी, यदि आप लिखते हैं f('a'), तो आप शायद ओवरलोड रिज़ॉल्यूशन चुनना चाहते हैंf(char) बजाय इसके कि कॉल केf(int) । के सापेक्ष आकार intऔर charरूप में आप कहते हैं, प्रासंगिक नहीं हैं।
zwol

21

मैं विशिष्ट कारणों को नहीं जानता कि C का एक अक्षर शाब्दिक प्रकार int क्यों है। लेकिन C ++ में, इस तरह से नहीं जाने का एक अच्छा कारण है। इस पर विचार करो:

void print(int);
void print(char);

print('a');

आप उम्मीद करेंगे कि प्रिंट करने के लिए कॉल एक चार्ट लेने के दूसरे संस्करण का चयन करें। एक चरित्र शाब्दिक होने के कारण एक इंटेंस असंभव हो जाएगा। ध्यान दें कि C ++ में एक से अधिक वर्ण वाले शाब्दिक अभी भी प्रकार के हैं, हालांकि उनके मूल्य को क्रियान्वित परिभाषित किया गया है। तो, 'ab'प्रकार है int, जबकि 'a'प्रकार है char


हां, "C ++ का डिजाइन और विकास" कहता है कि अधिभारित इनपुट / आउटपुट रूटीन मुख्य कारण थे C ++ ने नियमों को बदल दिया।
मैक्स लाइबबर्ट

5
मैक्स, हाँ, मैंने धोखा दिया। मैंने संगतता अनुभाग में मानक को देखा :)
जोहान्स स्काउब -

18

अपने मैकबुक पर gcc का उपयोग करते हुए, मैं कोशिश करता हूं:

#include <stdio.h>
#define test(A) do{printf(#A":\t%i\n",sizeof(A));}while(0)
int main(void){
  test('a');
  test("a");
  test("");
  test(char);
  test(short);
  test(int);
  test(long);
  test((char)0x0);
  test((short)0x0);
  test((int)0x0);
  test((long)0x0);
  return 0;
};

जो जब चलाने देता है:

'a':    4
"a":    2
"":     1
char:   1
short:  2
int:    4
long:   4
(char)0x0:      1
(short)0x0:     2
(int)0x0:       4
(long)0x0:      4

जो बताता है कि एक चरित्र 8 बिट्स है, जैसे आपको संदेह है, लेकिन एक चरित्र शाब्दिक एक इंट है।


7
दिलचस्प होने के लिए +1। लोग अक्सर सोचते हैं कि sizeof ("a") और sizeof ("") char * के हैं और उन्हें 4 (या 8) देने चाहिए। लेकिन वास्तव में वे उस बिंदु पर char [] हैं (sizeof (char [11]) 11 देता है)। न्यूबियों के लिए एक जाल।
paxdiablo

3
एक चरित्र शाब्दिक एक इंट को बढ़ावा नहीं दिया जाता है, यह पहले से ही एक इंट है। यदि वस्तु आकार ऑपरेटर का एक संचालक है तो कोई भी पदोन्नति नहीं होगी। अगर वहाँ था, तो यह आकार के उद्देश्य को हरा देगा।
क्रिस यंग

@ क्रिस यंग: हां। जाँच। धन्यवाद।
dmckee --- पूर्व-संचालक बिल्ली का बच्चा

8

जब C लिखा जा रहा था, तब PDP-11 की MACRO-11 विधानसभा भाषा थी:

MOV #'A, R0      // 8-bit character encoding for 'A' into 16 bit register

असेंबली लैंग्वेज में इस तरह की बात काफी सामान्य है - निम्न 8 बिट्स वर्ण कोड धारण करेंगे, अन्य बिट्स 0. PDP-11 को मंजूरी दे दी गई है:

MOV #"AB, R0     // 16-bit character encoding for 'A' (low byte) and 'B'

इसने दो पात्रों को 16 बिट रजिस्टर के निम्न और उच्च बाइट्स में लोड करने का एक सुविधाजनक तरीका प्रदान किया। फिर आप कुछ पाठ डेटा या स्क्रीन मेमोरी को अपडेट करते हुए, उन्हें कहीं और लिख सकते हैं।

इसलिए, आकार को पंजीकृत करने के लिए प्रचारित किए जाने वाले पात्रों का विचार काफी सामान्य और वांछनीय है। लेकिन, मान लें कि आपको हार्ड-कोडेड ओपकोड के हिस्से के रूप में 'ए' प्राप्त करने की आवश्यकता है, लेकिन मुख्य मेमोरी वाले कहीं से:

address: value
20: 'X'
21: 'A'
22: 'A'
23: 'X'
24: 0
25: 'A'
26: 'A'
27: 0
28: 'A'

यदि आप इस मुख्य मेमोरी से सिर्फ एक 'ए' को एक रजिस्टर में पढ़ना चाहते हैं, तो आप कौन सा पढ़ेंगे?

  • कुछ सीपीयू केवल 16 बिट मूल्य को 16 बिट रजिस्टर में पढ़ने का सीधे समर्थन कर सकते हैं, जिसका अर्थ है कि 20 या 22 पर एक रीड होगा और फिर 'एक्स' से बिट्स की आवश्यकता होगी, और सीपीयू एक या अन्य के अंत में निर्भर करता है कम क्रम बाइट में स्थानांतरण की आवश्यकता होगी।

  • कुछ सीपीयू के लिए एक मेमोरी-एलायंस रीड की आवश्यकता हो सकती है, जिसका अर्थ है कि इसमें शामिल सबसे कम एड्रेस एक से अधिक डेटा साइज का होना चाहिए: आप 24 और 25 के पते से पढ़ सकते हैं, लेकिन 27 और 28 को नहीं।

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

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

(के पेज 6-25 पर 6.3.3 देखें http://www.dmv.net/dec/pdf/macro.pdf )


5

मुझे याद है कि K & R को पढ़ना और एक कोड स्निपेट को देखना जो एक समय में एक पात्र को पढ़ता था जब तक कि यह EOF को हिट नहीं करता। चूँकि सभी वर्ण फ़ाइल / इनपुट स्ट्रीम में होने के लिए मान्य वर्ण हैं, इसका मतलब यह है कि EOF का कोई चार्ट मूल्य नहीं हो सकता है। रीड कैरेक्टर को इंट में डालने के लिए कोड क्या था, फिर ईओएफ के लिए परीक्षण करें, फिर अगर यह नहीं था तो एक चार में कन्वर्ट करें।

मुझे लगता है कि यह आपके प्रश्न का सटीक उत्तर नहीं देता है, लेकिन यदि ईओएफ शाब्दिक था, तो यह बाकी चरित्र शाब्दिकों के आकार (इंट) के लिए कुछ मायने रखेगा।

int r;
char buffer[1024], *p; // don't use in production - buffer overflow likely
p = buffer;

while ((r = getc(file)) != EOF)
{
  *(p++) = (char) r;
}

मुझे नहीं लगता कि 0 एक वैध चरित्र है।
22

3
@ जीबीजैनब: निश्चित रूप से यह है। यह अशक्त चरित्र है। इसके बारे में सोचो। क्या आपको लगता है कि किसी भी फ़ाइल को किसी भी शून्य बाइट्स की अनुमति नहीं दी जानी चाहिए?
पी डैडी

1
विकिपीडिया पढ़ें - "ईओएफ का वास्तविक मूल्य एक प्रणाली पर निर्भर नकारात्मक संख्या है, आमतौर पर -1, जो किसी भी मान्य वर्ण कोड के लिए असमान होने की गारंटी है।"
मैलक्स

2
जैसा कि Malx कहता है - EOF एक चार प्रकार नहीं है - यह एक अंतर प्रकार है। getchar () और दोस्त एक इंटेंस लौटाते हैं, जो बिना संघर्ष के ईओएफ के साथ-साथ किसी भी चार को पकड़ सकता है। यह वास्तव में प्रकार int करने के लिए शाब्दिक वर्ण की आवश्यकता नहीं होगी।
माइकल बूर

2
EOF == -1, C के चरित्र स्थिरांक के लंबे समय बाद आया, इसलिए यह एक उत्तर नहीं है और प्रासंगिक भी नहीं है।
जिम बाल्टर

5

मैंने इसके लिए कोई औचित्य नहीं देखा है (C char शाब्दिक रूप से int प्रकार), लेकिन यहाँ कुछ Stroustrup को इसके बारे में कहना था (Design and Evolution से 11.2.1 - ललित-अन्न संकल्प):

सी में, एक चरित्र शाब्दिक का प्रकार जैसे 'a'है int। हैरानी की बात है, C ++ में 'a'टाइप करने charसे कोई अनुकूलता समस्या नहीं होती है। पैथोलॉजिकल उदाहरण को छोड़कर sizeof('a'), प्रत्येक निर्माण जो C और C ++ दोनों में व्यक्त किया जा सकता है, वही परिणाम देता है।

तो अधिकांश भाग के लिए, यह कोई समस्या नहीं होनी चाहिए।


दिलचस्प! किंडा के विपरीत है कि दूसरों कैसे सी मानक समिति "बुद्धिमानी से" सी से इस मोड़ को दूर नहीं करने का फैसला के बारे में कह रहे थे
quirk j_random_hacker

2

इसका ऐतिहासिक कारण यह है कि C, और इसके पूर्ववर्ती B को मूल रूप से DEC PDP मिनिकोमप्वाइंट के विभिन्न मॉडलों पर विभिन्न शब्द आकारों के साथ विकसित किया गया था, जो 8-बिट ASCII का समर्थन करता था, लेकिन केवल रजिस्टरों पर अंकगणित कर सकता था। (पीडीपी -11 नहीं, हालांकि, जो बाद में आया।) सी के प्रारंभिक संस्करणों intको मशीन के मूल शब्द के आकार के रूप में परिभाषित किया गया है, और किसी फ़ंक्शन से पारित होने के लिए या उससे अधिक intचौड़ी होने के लिए आवश्यक किसी भी मूल्य से छोटा है। int, या एक बिट वाइज, तार्किक या अंकगणितीय अभिव्यक्ति में उपयोग किया जाता है, क्योंकि यह अंतर्निहित हार्डवेयर काम करता था।

यही कारण है कि पूर्णांक पदोन्नति नियम अभी भी कहते हैं कि किसी भी प्रकार से छोटे डेटा intको बढ़ावा दिया जाता है int। सी कार्यान्वयन को समान ऐतिहासिक कारणों के लिए दो-पूरक के बजाय एक-पूरक गणित का उपयोग करने की अनुमति है। हेक्स की तुलना में ऑक्टल चरित्र से बचने और ऑक्टल स्थिरांक प्रथम श्रेणी के नागरिक हैं इसका कारण यह है कि उन शुरुआती डीईसी मिनिकॉमपॉइंट्स के शब्द आकार तीन-बाइट विखंडनों में विभाजित थे, लेकिन चार-बाइट निबल्स नहीं थे।


... और charवास्तव में 3 अष्टक अंक लंबा था
एंटटी हवाला

1

यह सही व्यवहार है, जिसे "अभिन्न पदोन्नति" कहा जाता है। यह अन्य मामलों में भी हो सकता है (मुख्य रूप से बाइनरी ऑपरेटरों, अगर मुझे सही याद है)।

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

चरित्र शाब्दिक प्रकार int है और वे प्रकार चार से पदोन्नति के लिए नियमों का पालन करके वहाँ मिलता है। यह बहुत संक्षेप में K & R 1 में शामिल है, पृष्ठ 39 पर जहाँ यह कहता है:

एक अभिव्यक्ति में हर चार को एक इंट में बदल दिया जाता है .... ध्यान दें कि एक अभिव्यक्ति में सभी फ्लोट को डबल में बदल दिया जाता है .... चूंकि एक फ़ंक्शन तर्क एक अभिव्यक्ति है, प्रकार के रूपांतरण भी तब होते हैं जब तर्क कार्यों के लिए पारित किए जाते हैं: विशेष रूप से, चार और शॉर्ट इंट हो जाते हैं, फ्लोट डबल हो जाता है।


यदि अन्य टिप्पणियों पर विश्वास किया जाए, तो 'a' टाइप int से शुरू होता है - कोई आकार () के अंदर कोई प्रकार का प्रचार नहीं किया जाता है। यह 'a' टाइप int है C का मात्र एक क्विक है ऐसा लगता है।
j_random_hacker

2
एक चार शाब्दिक करता है प्रकार int है। ANSI / ISO 99 मानक उन्हें 'पूर्णांक वर्ण स्थिरांक' कहता है (उन्हें 'विस्तृत वर्ण स्थिरांक' से अलग करने के लिए, जिसमें wchar_t टाइप है) और विशेष रूप से कहते हैं, "एक पूर्णांक वर्ण स्थिरांक का प्रकार int है।"
माइकल बूर

मेरा मतलब यह था कि यह टाइप इंट से शुरू नहीं होता है , बल्कि चार (उत्तर संपादित) से इंट में बदल जाता है। बेशक, यह संभवतः कंपाइलर लेखकों को छोड़कर किसी को चिंता नहीं करता क्योंकि रूपांतरण हमेशा किया जाता है।
PolyThinker

3
नहीं! यदि आप ANSI / ISO 99 C मानक पढ़ते हैं, तो आप पाएंगे कि C में, अभिव्यक्ति 'a' टाइप int से शुरू होती है । यदि आपके पास एक फ़ंक्शन void f (int) और एक वैरिएबल char c है, तो f (c) इंटीग्रल प्रमोशन करेगा , लेकिन f ('a') नहीं होगा क्योंकि 'a' का प्रकार पहले से ही int है। अजीब बात है लेकिन सच है।
j_random_hacker

2
"बस सुनिश्चित होने के लिए" - आप वास्तव में बयान पढ़कर और अधिक निश्चित हो सकते हैं: "चरित्र शाब्दिक प्रकार int है"। "मैं केवल यह मान सकता हूं कि मौन परिवर्तनों में से एक था" - आप गलत तरीके से मानते हैं। C में अक्षर शाब्दिक हमेशा प्रकार के होते हैं।
जिम बाल्टर

0

मुझे नहीं पता, लेकिन मुझे लगता है कि इसे इस तरह से लागू करना आसान था और यह वास्तव में मायने नहीं रखता था। यह C ++ तक नहीं था जब प्रकार यह निर्धारित कर सकता है कि कौन सा फ़ंक्शन यह कहेगा कि इसे ठीक करने की आवश्यकता है।


0

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


1
एक और गरीब "जवाब"। अपने आप कनवर्ट charकरने के लिए intयह काफी होगा अनावश्यक चरित्र स्थिरांक ints होने के लिए। यह प्रासंगिक है कि भाषा वर्ण विभेदकों को अलग-अलग तरह से (उन्हें एक अलग प्रकार देकर) charवैरिएबल से व्यवहार करती है, और जो आवश्यक है वह उस अंतर का स्पष्टीकरण है।
जिम बेल्टर

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

0

यह केवल भाषा युक्ति के लिए स्पर्शरेखा है, लेकिन हार्डवेयर में आमतौर पर सीपीयू का केवल एक ही रजिस्टर आकार होता है - 32 बिट्स, मान लीजिए - और इसलिए जब भी यह वास्तव में एक चार पर काम करता है (इसे जोड़कर, घटाकर या तुलना करके) जब यह रजिस्टर में लोड किया जाता है तो इंट का अंतर्निहित रूपांतरण। कंपाइलर प्रत्येक ऑपरेशन के बाद नंबर को ठीक से मास्किंग और शिफ्ट करने का ध्यान रखता है ताकि यदि आप जोड़ते हैं, कहते हैं, 2 से (अहस्ताक्षरित चार) 254 है, तो यह 256 के बजाय 0 के आसपास लपेटेगा, लेकिन सिलिकॉन के अंदर यह वास्तव में एक इंट है जब तक आप इसे वापस स्मृति में सहेजते हैं।

यह एक शैक्षणिक बिंदु की तरह है क्योंकि भाषा में 8-बिट शाब्दिक प्रकार निर्दिष्ट किया जा सकता है, लेकिन इस मामले में भाषा की कल्पना अधिक बारीकी से प्रतिबिंबित करने के लिए होती है कि सीपीयू वास्तव में क्या कर रहा है।

(x86 विनक्स यह नोट कर सकते हैं कि उदाहरण के लिए एक देशी एडहैस ऑप है जो एक चरण में शॉर्ट-वाइड रजिस्टरों को जोड़ता है, लेकिन आरआईएससी कोर के अंदर यह दो चरणों में बदल जाता है: संख्याओं को जोड़ें, फिर एक ऐड / एक्सट्रेस पेयर की तरह साइन बढ़ाएँ। पॉवरपीसी)


1
फिर भी एक और गलत जवाब। यहाँ मुद्दा यह है कि चरित्र शाब्दिक और charचर अलग-अलग प्रकार के क्यों होते हैं। स्वचालित प्रचार, जो हार्डवेयर को प्रतिबिंबित करते हैं, प्रासंगिक नहीं हैं - वे वास्तव में प्रासंगिक हैं, क्योंकि charचर स्वचालित रूप से प्रचारित होते हैं , इसलिए यह वर्ण शाब्दिक प्रकार का नहीं होने का कोई कारण नहीं है char। असली कारण मल्टीबाइट शाब्दिक है, जो अब अप्रचलित हैं।
जिम बाल्टर

@Jim Balter मल्टीबाइट शाब्दिक अप्रचलित नहीं हैं; मल्टीबाइट यूनिकोड और यूटीएफ वर्ण हैं।
क्रैशवर्क

@ क्रशवर्क्स हम मल्टीबाइट चरित्र शाब्दिक के बारे में बात कर रहे हैं , न कि मल्टीबैट स्ट्रिंग शाब्दिक। ध्यान देने की कोशिश करो।
जिम बाल्टर

4
वर्णसंकर ने चरित्र लिखे । आपको लिखा जाना चाहिए कि व्यापक चरित्र शाब्दिक (L'à 'कहते हैं) अधिक बाइट लेते हैं, लेकिन मल्टीबाइट चार शाब्दिक नहीं कहा जाता है। कम अभिमानी होने के कारण आप खुद को अधिक सटीक होने में मदद करेंगे।
Blaisorblade

@ ब्लेज़रब्लड व्यापक चरित्र शाब्दिक यहाँ प्रासंगिक नहीं हैं - उनका मेरे लिखे हुए से कोई लेना-देना नहीं है। मैं सही था और आपको समझ में कमी थी और आपका सही प्रयास मुझे सही करने के लिए अहंकारी है।
जिम बेल्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.