Int32, int, int32_t, int8 और int8_t के बीच अंतर


103

मैं int32_tहाल ही में एक C प्रोग्राम में डेटा टाइप पर आया था । मुझे पता है कि यह 32 बिट्स स्टोर करता है, लेकिन नहीं intऔरint32 एक ही करते हैं?

इसके अलावा, मैं charएक कार्यक्रम में उपयोग करना चाहते हैं । क्या में उपयोग कर सकता हूँint8_t इसके बजाय ? अंतर क्या है?

संक्षेप में: C में int32, int, int32_t, int8 और int8_t में क्या अंतर है?

जवाबों:


122

बीच int32और int32_t, (और इसी तरह के बीच int8और int8_t) अंतर बहुत सरल है: सी मानक परिभाषित करता है int8_tऔर int32_t, लेकिन कुछ भी नामित परिभाषित नहीं करता है int8या int32- उत्तरार्द्ध (अगर वे सब पर मौजूद हैं) कुछ अन्य शीर्ष लेख या लाइब्रेरी से शायद है (सबसे अधिक संभावना के अलावा पहले का है int8_tऔर int32_tC99 में)।

प्लेन intदूसरों से काफी अलग है। जहाँ int8_tऔर int32_tप्रत्येक का एक निर्दिष्ट आकार है, intकिसी भी आकार> = 16 बिट्स हो सकता है। अलग-अलग समय पर, 16 बिट्स और 32 बिट्स दोनों सामान्य रूप से सामान्य रहे हैं (और 64-बिट कार्यान्वयन के लिए, यह संभवतः 64 बिट्स होना चाहिए)।

दूसरी ओर, intसी के हर कार्यान्वयन में मौजूद होने की गारंटी है, जहां int8_tऔर int32_tनहीं हैं। यह शायद सवाल के लिए खुला है कि क्या यह आपके लिए मायने रखता है। यदि आप छोटे एम्बेडेड सिस्टम और / या पुराने संकलक पर सी का उपयोग करते हैं, तो यह एक समस्या हो सकती है। यदि आप इसे मुख्य रूप से डेस्कटॉप / सर्वर मशीनों पर एक आधुनिक संकलक के साथ उपयोग करते हैं, तो यह संभवतः नहीं होगा।

उफ़ - के बारे में हिस्सा याद किया char। आप int8_tचार के बजाय का उपयोग करेंगे (यदि और केवल अगर) तो आप चाहते हैं कि एक पूर्णांक प्रकार की गारंटी दी जाए जो आकार में बिल्कुल 8 बिट्स हो। यदि आप वर्ण संग्रहीत करना चाहते हैं, तो आप संभवतः charइसके बजाय उपयोग करना चाहते हैं । इसका आकार अलग-अलग हो सकता है (बिट की संख्या के संदर्भ में) लेकिन यह बिल्कुल एक बाइट होने की गारंटी है। हालांकि एक मामूली विषमता: इस बारे में कोई गारंटी नहीं है कि क्या एक सादे charहस्ताक्षरित या अहस्ताक्षरित है (और कई संकलक इसे या तो एक बना सकते हैं, एक संकलन-समय ध्वज के आधार पर)। यदि आपको यह सुनिश्चित करने की आवश्यकता है कि हस्ताक्षर या अहस्ताक्षरित हैं, तो आपको स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है।


1
@linuxfreak: इस बारे में निश्चित नहीं bool_t- इससे पहले कभी नहीं सुना। सी मानक _Boolएक निर्मित प्रकार के रूप में परिभाषित करता है । boolकेवल तभी परिभाषित किया जाता है यदि आप #include <stdbool.h>(एक मैक्रो के रूप में जो विस्तार करते हैं _Bool)।
जेरी कॉफिन

5
आपने कहा "64-बिट कार्यान्वयन के लिए, (int) संभवतः 64 बिट्स होना चाहिए"। व्यवहार में, इंट विंडोज़, मैक ओएस एक्स, लिनक्स और यूनिक्स के विभिन्न स्वादों सहित सभी सामान्य 64-बिट प्लेटफार्मों पर 32-बिट है। एक अपवाद क्रे / यूएनआईसीओएस है लेकिन वे इन दिनों फैशन से बाहर हैं।
सैम वाटकिंस

6
@SamWatkins: हाँ, इसीलिए मैंने सावधानी से कहा "होना चाहिए", "नहीं" है। मानक कहते हैं कि यह "वास्तुकला द्वारा सुझाया गया प्राकृतिक आकार" है, जो (IMO) का अर्थ 64-बिट प्रोसेसर पर है, यह वास्तव में 64 बिट होना चाहिए (हालांकि, बेहतर या बदतर के लिए, आप काफी सही हैं कि यह आमतौर पर isn है ' टी)। अधिक व्यावहारिक दृष्टिकोण से, C89 के प्रकारों में 32-बिट प्रकार का होना बहुत मुश्किल है , और यदि int 64 बिट्स है, तो लंबे समय तक कम से कम 64 बिट्स होना आवश्यक है, इसलिए अक्सर कोई 32-बिट नहीं होगा प्रकार।
जेरी कॉफिन

2
@barlop: हाँ। (C और C ++ दोनों में चार्ट के लिए 255 मानों की न्यूनतम सीमा अनिवार्य है, इसलिए इसे कम से कम 8 बिट्स की आवश्यकता होती है, लेकिन अधिक हो सकती है)।
जेरी कॉफ़िन

2
मैं हमेशा इस धारणा के अधीन था कि एक बाइट बिल्कुल 8 बिट्स थी, ऊपर 8 बिट्स से कहीं भी नहीं
ErlVolton

18

_T डेटा प्रकार stdint.h हैडर में टाइप किए गए प्रकार होते हैं, जबकि इंट एक अंतर्निहित मूलभूत डेटा प्रकार होता है। यह तभी उपलब्ध होता है जब stdint.h मौजूद होता है। दूसरी ओर int मौजूद होने की गारंटी है।


1
क्यों कोई _t का उपयोग करेगा?
देवेन

@Deven उस मामले से बचने के लिए जहां आपका कोड कहीं और काम करता है लेकिन कहीं और नहीं।
फ्रैंकलिन यू

2

हमेशा ध्यान रखें कि यदि आप घोषित करते हैं तो 'आकार' परिवर्तनशील नहीं है

 int i = 10;

कुछ प्रणालियों पर संकलक द्वारा 16-बिट पूर्णांक हो सकता है और कुछ अन्य पर इसका परिणाम 32-बिट पूर्णांक (या नए सिस्टम पर 64-बिट पूर्णांक) हो सकता है।

एम्बेडेड वातावरण में यह अजीब परिणामों में समाप्त हो सकता है (विशेषकर स्मृति मैपिंग I / O को संभालने के दौरान या एक साधारण सरणी स्थिति पर विचार किया जा सकता है), इसलिए यह निश्चित आकार चर निर्दिष्ट करने के लिए अत्यधिक अनुशंसित है। विरासत प्रणालियों में आप भर में आ सकते हैं

 typedef short INT16;
 typedef int INT32;
 typedef long INT64; 

C99 से शुरू होकर, डिजाइनरों ने stdint.h हेडर फाइल को जोड़ा जो अनिवार्य रूप से इसी तरह के टाइपफेड का लाभ उठाता है।

विंडोज़ आधारित प्रणाली पर, आप stdin.h हेडर फ़ाइल में प्रविष्टियाँ देख सकते हैं

 typedef signed char       int8_t;
 typedef signed short      int16_t;
 typedef signed int        int32_t;
 typedef unsigned char     uint8_t;

न्यूनतम चौड़ाई पूर्णांक या सटीक चौड़ाई पूर्णांक प्रकारों की तरह इसमें और भी बहुत कुछ है, मुझे लगता है कि बेहतर समझ के लिए stdint.h की खोज करना कोई बुरी बात नहीं है।


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