Int केवल 2 बाइट्स क्यों है?


9

अन्य प्लेटफार्मों पर C / C ++ का उपयोग करते समय, intप्रकार आमतौर पर 4 बाइट्स (या संभवतः अधिक) होता है। हालांकि, Arduino पर, यह केवल 2 बाइट्स है।

यह अलग क्यों है? यदि मैं हमेशा 4 बाइट का उपयोग करता हूं तो क्या यह प्रदर्शन को प्रभावित करता है long?


2
ध्यान दें कि intArduino ड्यू पर 4 बाइट्स है। एक shortसभी मौजूदा Ardunios पर 2 बाइट हो जाएगा, लेकिन मैं उपयोग करने के लिए दूसरों की सलाह पर जोर देना int16_tया uint16_t
रॉन

जवाबों:


10

बहुत सारे Arduinos में प्रयुक्त ATmega328 एक 8-बिट माइक्रोकंट्रोलर है। इसका मतलब है कि रजिस्टर 8-बिट हैं, डेटा बस 8-बिट है, पोर्ट 8-बिट हैं। सिस्टम में कुछ न्यूनतम 16-बिट पहलू हैं (जैसे टाइमर में से एक), लेकिन लगभग सब कुछ 8-बिट्स है।

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

8-बिट स्पष्ट रूप से 8-बिट पोर्ट को संबोधित करने के लिए पर्याप्त है। यह कई लूप काउंटर, रिटर्न वैल्यू और एएससीआईआई कैरेक्टर से निपटने के लिए भी पर्याप्त है। यह वास्तव में पर्याप्त नहीं है जब संख्या के साथ काम कर रहा है। एक हस्ताक्षरित 8-बिट इंट (int8_t) केवल -128-> +127 का प्रतिनिधित्व कर सकता है। Unsigned (uint8_t) केवल 0 -> 255 का प्रतिनिधित्व कर सकता है।

8-बिट पूर्णांक काफी सीमित हैं। C / C ++ int को कम से कम -32,678 -> +32,767 का प्रतिनिधित्व करना चाहिए ताकि int16_t पर नक्शे - सबसे छोटा आकार जो ऐसा करेगा। यह सीमा और दक्षता का एक अच्छा संतुलन देता है। यह विशेष रूप से महत्वपूर्ण है जब शुरुआती सीख रहे हैं - अतिप्रवाह वास्तव में ऐसा कुछ नहीं है जो गैर-प्रोग्रामर समझें।

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

हम में से कई लोग देशी प्रकारों जैसे कि int8_t और uint8_t पर स्विच करते हैं क्योंकि यह आपको कहीं अधिक नियंत्रण प्रदान करता है।


3
बस एक नोट: यह Arduino टीम नहीं है जो int16_t से मैप किया गया है, "int" एक C / C ++ आरक्षित कीवर्ड है, और टाइपिंग मैपिंग ABI ( gcc.gnu.org/wiki/avr.gcc ) का हिस्सा है जो avr-gcc संकलक के डेवलपर्स ने अनुसरण करने का निर्णय लिया। एक और उल्लेखनीय अंतर "डबल" प्रकार में है जो आमतौर पर 64 बिट चौड़ा होता है, जबकि
एवर

धन्यवाद। यकीन नहीं होता कि मैंने ऐसा क्यों लिखा। मुझे पता है कि int को 32,678 -> +32,767 का प्रतिनिधित्व करना चाहिए (हालांकि, वास्तव में, मुझे लगता है कि एनईसी प्रोसेसर में से एक के लिए एक मालिकाना संकलक था जो इस का पालन नहीं करता था)। मुझे लगता है कि यह इसलिए है क्योंकि मुझे एम्बेडेड सिस्टम पर चौड़ाई छिपाना पसंद नहीं है - int16_t का उपयोग करना बहुत स्पष्ट है।
Cybergibbons

1
स्पष्ट देशी प्रकारों के उपयोग के लिए +1! Arduino देय पर, एक int32-बिट है! arduino.cc/en/Reference/int
रॉन

3

C और C ++ भाषाओं के बारे में एक महत्वपूर्ण तथ्य यह है कि उनके संबंधित मानक अभिन्न और अस्थायी बिंदु संख्या प्रकारों के आकार (बाइट्स में) को परिभाषित नहीं करते हैं।

वे सिर्फ न्यूनतम सीमाओं को परिभाषित करते हैं और इन सीमाओं के बीच संबंध, उदाहरण के लिए

range(short) <= range(int) < range(long)

इसलिए उदाहरण के लिए intआम तौर पर इस पर निर्भर करेगा:

  • लक्ष्य मंच (प्रोसेसर)
  • संकलक ही

क्या आप कह रहे हैं sizeof(short) == sizeof(int) == sizeof(long)संभव है?
रॉन

@ रॉन-ई सैद्धांतिक रूप से, हाँ, यह संभव होगा। हालाँकि, मैंने कभी ऐसा नहीं देखा। अधिकांश संकलक / प्लेटफार्मों में, कोई उम्मीद कर सकता है (हालांकि यह लगाया नहीं गया है) sizeof(short) < sizeof(long)
jfpoilpret
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.