C में छोटे, int, और लंबे आविष्कार क्यों किए गए?


16

मुझे समझने में कठिनाई आ रही है, बनाने का सही उद्देश्यों क्या थे short, intऔर longसी में डेटा प्रकार?

मेरे द्वारा पूछे जाने का कारण यह नहीं है कि ऐसा लगता है कि उनके आकार बंधे हुए हैं - वे किसी भी आकार के हो सकते हैं , उदाहरण के लिए , जब तक shortवह छोटा होता है int

तब, किन स्थितियों में, आपको उदाहरण के लिए, unsigned intया unsigned long, का उपयोग करना चाहिए size_t, जब ऐसा करने से द्विआधारी संगतता की कोई उम्मीद नहीं है?

(यदि आप आकार नहीं जानते हैं, तो आप कैसे जानेंगे कि कब किसे चुनना है?)


2
चेक आउट करें<stdint.h>
ब्लैकजैक

1
@ ब्लेकजैक: हाहा हाँ, वास्तव में मेरे पास है - लेकिन मुझे लगता है कि मेरा सवाल यह है कि उन सभी प्रकारों को मूल रूप से परिभाषित क्यों नहीं किया जाता है? क्या यह "हिंडाइट 20/20" मुद्दा है, या कोई विशिष्ट कारण था?
user541686 30

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

@ एसके-तर्क: यहां तक ​​कि अगर उन्होंने कहा sizeof(short) == 2 * sizeof(char)या समान नहीं है?
user541686

1
ऐसे मंच हैं जहां sizeof(char) == sizeof(short), और यह समझ में आता है। दुर्भाग्य से, अभिन्न संख्या प्रकारों को निर्दिष्ट करने का कोई तरीका नहीं है कि वे सभी संभावित और मौजूदा प्लेटफार्मों पर फिट होंगे ।
एसके-लॉजिक

जवाबों:


12

यह आपके द्वारा उपयोग की जा रही वास्तुकला द्वारा परिभाषित किया जाएगा। एक Zilog z80 चिप (आम एम्बेडेड चिप) पर वे एक आकार के होंगे जबकि वे x86 चिपसेट पर एक पूरी तरह से अलग आकार के हो सकते हैं। हालांकि, आकार स्वयं एक दूसरे के लिए निश्चित अनुपात हैं। अनिवार्य रूप से छोटे और लंबे प्रकार नहीं हैं, लेकिन इंट प्रकार के लिए योग्य हैं। शॉर्ट इन्टस परिमाण के एक क्रम से कम (नियमित) इंट और लंबे इनट्स परिमाण का एक आदेश अधिक होगा। तो मान लीजिए आपका Int 4 बाइट्स के लिए बाध्य है, शॉर्ट क्वालिफायर इसे 4 बाइट्स के लिए बांधता है, हालांकि 2 बाइट्स भी बहुत आम है और लंबे क्वालीफायर इसे संभावित रूप से 8 बाइट्स तक बढ़ा देता है, हालांकि यह 4 बाइट्स से कम हो सकता है। ध्यान रखें कि यह शब्द की लंबाई के साथ-साथ 32 बिट सिस्टम पर भी है जिसे आप 4 बाइट प्रति मिनट की दर से बढ़ा सकते हैं। इस प्रकार, लघु, इंट Short लंबे।

हालाँकि, यदि आप इसे फिर से लंबा करते हैं, तो आप इंट में अगली सेल में आपको 8 पूरे बाइट्स स्टोरेज दे सकते हैं। यह 64 बिट मशीनों के लिए शब्द का आकार है, इसलिए उन्हें ऐसी चीजों के बारे में चिंता करने की ज़रूरत नहीं है और बस एक सेल का उपयोग लंबी ints के लिए करते हैं, जिससे उन्हें मानक ints से ऊपर एक और ऑर्डर करने की अनुमति मिलती है जबकि लंबे ints वास्तव में बहुत कम मिलते हैं।

जहाँ तक चुनने के लिए, यह कुछ इस तरह से उबलता है कि उदाहरण के लिए जावा प्रोग्रामर को चिंता करने की ज़रूरत नहीं है। "आपकी वास्तुकला क्या है?" चूंकि यह सब प्रश्न में मशीन की मेमोरी के शब्द आकार पर निर्भर करता है, इसलिए आपको यह तय करना होगा कि आपको कौन सा उपयोग करना है, यह तय करने से पहले सामने वाले को समझना होगा। फिर आप जितनी छोटी मेमोरी बचा सकते हैं, उतने छोटे आकार को चुनें क्योंकि वह मेमोरी आवंटित की जाएगी चाहे आप उसमें सभी बिट्स का उपयोग करें या नहीं। इसलिए आप बचा सकते हैं और जब आप शॉर्ट्स उठा सकते हैं और जब आप नहीं कर सकते हैं, तो आपको जो कुछ भी नियमित रूप से इन्ट्स देता है उससे बड़ा चाहिए। जब तक आप शब्द छत से नहीं टकराएंगे, तब तक आप आवश्यक होंगे। फिर आपको बड़ी संख्या में रूटीन की आपूर्ति करने या उन्हें एक पुस्तकालय से प्राप्त करने की आवश्यकता होगी।

सी अच्छी तरह से "पोर्टेबल असेंबली" हो सकता है लेकिन आपको अभी भी अपने हार्डवेयर को जानना होगा।


11
यह बिल्कुल सही नहीं है, शॉर्ट्स को चींटियों से छोटा नहीं होना चाहिए, वे चींटियों से बड़ा नहीं हो सकते
jk।

मैं इसे सही करूंगा।
वर्ल्ड इंजीनियर

2
इसी तरह, लैंट्स की तुलना में छोटे नहीं हो सकते।
डोनल फैलो

1
वास्तव में मेरा मानना ​​है कि ऐसी मशीनें हैं, जहां शॉर्ट, इंट और लॉन्ग जहां बिल्कुल समान हैं।
जे.के.

6

हालांकि आज, एक "बाइट" का अर्थ है "8 बिट्स", जो हमेशा सच नहीं रहा है। मशीनों ने 4 बिट्स, 8 बिट्स, 12 बिट्स, 16 बिट्स, 32 बिट्स, और 36 बिट्स (और शायद कुछ अन्य आकार के रूप में अच्छी तरह से) का पता लगाने योग्य हिस्सा का उपयोग किया है। सी के डिजाइन इरादों में से एक अलग मेमोरी साइज और कॉन्फ़िगरेशन वाली मशीनों पर प्रयोग करने योग्य था।

मुझे लगता है कि डिजाइन का उद्देश्य मूल रूप से यह था कि प्रत्येक प्रकार के अलावा intसबसे छोटी चीज जो विभिन्न आकारों की संख्या को संभाल सकती है, और यह intसबसे व्यावहारिक "सामान्य-उद्देश्य" आकार हो सकती है जो +/- 32767 को संभाल सकती है। मुझे नहीं लगता कि भाषा बनाने की कोई इच्छा या मंशा थी जो तब भी उपयोग में होगी जब कंप्यूटर इतने शक्तिशाली हो गए कि 64-बिट संख्या पर संचालन छोटे लोगों पर संचालन के समान हो।

C के पूर्णांक-प्रकार के शब्दार्थों के साथ सबसे बड़ी समस्या यह है कि कुछ संदर्भों में वे कार्डिनल संख्याओं या गणितीय पूर्णांकों का प्रतिनिधित्व करते हैं, जबकि अन्य संदर्भों में वे पूर्णांक के पूर्णांक 2 के बीजीय बीजगणितीय रिंग के सदस्यों का प्रतिनिधित्व करने के लिए उपयोग किए जाते हैं। 0 से अधिकतम प्रतिनिधित्व योग्य मान 1 उपज के लिए परिभाषित किया गया है, लेकिन व्यवहारों को इस आधार पर अधिक निर्दिष्ट किया जाता है कि कंपाइलर उन दिनों को करने के लिए लग रहे थे जब कंप्यूटर शब्द का आकार लगभग 16 बिट्स था (और 36-बिट शब्द आकार बहुत बड़ा होता था ), बजाय 64-बिट मशीन पर क्या मतलब होगा के आधार पर। नतीजतन, एक छोटे से अहस्ताक्षरित 32-बिट मूल्य से 32-बिट अहस्ताक्षरित मूल्य को घटाने का परिणाम या तो एक बड़ा 32-बिट अहस्ताक्षरित मान हो सकता है, या एक नकारात्मक 64-बिट संख्या हो सकती है।


4

/programming/589575/size-of-int-long-etc

इसलिए सबसे अधिक इस्तेमाल किए जाने वाले आर्किटेक्चर में, चार 1 बाइट है, शॉर्ट और इंट कम से कम 2 बाइट्स हैं, और लॉन्ग कम से कम 4 बाइट्स हैं।

और यह इरादा है कि वर्तमान सीपीयू के लिए 'इंट' सबसे प्राकृतिक / सामान्य / कुशल प्रतिनिधित्व होना चाहिए।

इसलिए सामान्य नियम 'int' का उपयोग करना है, जब तक कि आपके मान +/- 32K से अधिक नहीं हो जाते, तब तक आप (पुराने CPU पर) 'लंबे' का उपयोग करते हैं। ... या जब तक आप छोटे (<32K) मानों के बड़े ऐरे बना रहे हैं, और मेमोरी एक मुद्दा है - इसलिए आप मेमोरी (या शायद 'चार' या 'बाइट') को बचाने के लिए 'शॉर्ट' का उपयोग करेंगे।


2
लेकिन 64-बिट के साथ, intशायद ही कभी एक अच्छा विकल्प है, है ना? पोर्टिंग कोड के साथ समस्याओं से बचने के लिए मैं लगभग हमेशा size_t(या यहां तक ​​कि ptrdiff_t!) का उपयोग करता हूं ।
user541686 30

@ मिरदाद - int का उपयोग सबसे अच्छी पसंद के लिए किया गया था, जो कि HW की 'मानक इकाई' थी और आमतौर पर एक पॉइंटर के आकार की थी। आजकल सुरक्षा के लिए size_t का उपयोग करें।
मार्टिन बेकेट

1

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.