2012-09-05 10 views
14

सी में छोटा int (या छोटा) और int अलग कैसे है? उनके पास एक ही आकार और सीमा है। यदि वे अनिवार्य रूप से वही हैं, तो दो डेटा प्रकारों का उपयोग क्या है?सी में "लघु int" और "int" के बीच क्या अंतर है?

+0

16-बिट कंपाइलर्स में, उनके पास समान आकार और सीमा होती है। मुख्यधारा के प्लेटफ़ॉर्म के लिए व्यावहारिक रूप से सभी आधुनिक कंपाइलर्स में 'sizeof (int)> sizeof (short) 'है। –

उत्तर

22

वे मई एक ही आकार है, लेकिन यह निश्चित है कि int के बराबर या short int से भी बड़ा है।

+3

वास्तव में क्या गारंटी है कि 'लघु int 'की * श्रेणी * कम से कम -32767 .. +32767 है, और' लघु int 'की सीमा' int' की सीमा का उप-समूह है। यह इस प्रकार से है कि 'लघु int' और 'int' कम से कम 16 बिट्स हैं। पैडिंग बिट्स के कारण, यह सैद्धांतिक रूप से संभव है कि 'आकार (छोटा int)> sizeof (int)' हो, लेकिन यह बहुत ही असंभव है। –

+1

@ किथ थॉम्पसन क्या आप 'आकार (लघु int)> sizeof (int) 'के बारे में विस्तार से बता सकते हैं? – SomeWittyUsername

+1

@icepack: इंटीजर प्रकारों में पैडिंग बिट्स हो सकते हैं, बिट्स जो मान में योगदान नहीं देते हैं। उदाहरण के लिए, एक अनुरूप कार्यान्वयन * सिद्धांत में * 32 बिट्स (उनमें से 16 पैडिंग बिट्स) और 'बिट' 24 बिट्स (सभी महत्वपूर्ण) के साथ 'छोटा' हो सकता है। मैं ऐसी मूर्खतापूर्ण चीज करने के किसी भी कारण के बारे में नहीं सोच सकता, लेकिन मानक इसे मना नहीं करता है। –

0

"एक प्रोग्रामिंग भाषा में एक छोटी पूर्णांक एक अलग भाषा में या एक अलग प्रोसेसर पर एक अलग आकार हो सकता है। कुछ भाषाओं में इस आकार, प्लेटफार्मों पर तय हो गई है जबकि अन्य लोगों में यह मशीन निर्भर है कुछ भाषाओं में यह डेटाटाइप पर मौजूद नहीं है। "

Source

+0

लेकिन सवाल सी –

+0

यूप के बारे में है और पोस्ट किया गया स्रोत लिंक सी, सी ++, सी # और जावा के लिए अंतर दिखाता है। – Ljdawson

+0

आपके द्वारा उद्धृत किया गया हिस्सा प्रश्न का उत्तर नहीं देता है। (बीटीडब्लू, उस पैराग्राफ को बाद में आलेख से हटा दिया गया था।) –

1

यह सिस्टम पर निर्भर करता है। कुछ ओएस के पास दोनों प्रकार के लिए समान लंबाई नहीं होगी।

3

सी में किसी दिए गए आकार के डेटाटाइप पर भरोसा न करें। संदेह में सीमाओं में सीमाओं को हमेशा जांचें।

+0

बेशक, यदि आप 'uint32_t' और '' से मित्र का उपयोग कर रहे हैं। – unwind

+1

वह सी 99 मानक का हिस्सा है जो हमें दूसरों द्वारा उठाए गए प्रश्न पर वापस लाता है जो ओएस/कंपाइलर का उपयोग किया जा रहा है। –

0

वास्तव में सबकुछ संकलक और सिस्टम दोनों पर निर्भर करता है। लेकिन मूल नियम कहता है कि int कभी भी कम से कम नहीं हो सकता है और कभी भी लंबे समय से अधिक नहीं हो सकता है।

कम < = पूर्णांक < = लंबे

+1

char <= छोटा? – cdarke

+1

char <= छोटा <= int <= लंबा <= लंबा लंबा। ध्यान दें कि [आईएसओ सी 0 9] (https://en.wikipedia.org/wiki/ANSI_C) – Ultimater

14

सिद्धांत रूप में/सी मानक से, वे किसी भी आकार के रूप में लंबे समय के रूप में short <= int हो सकता है।

असली दुनिया में, इस प्रकार आकार लागू किए जाते हैं।

CPU    short int 
8 bit   16  16 
16 bit   16  16 
32 bit   16  32 
64 bit   16  32 
+0

में लंबे समय तक समर्थित नहीं है, क्या आपने इसे 64 बिट में लिनक्स में ansi c में देखा है और 64 बिट में विंडो में दृश्य स्टूडियो I जानना चाहते हैं .. –

+2

@भारत शर्मा 64 बिट केवल 'लंबे' और 'लंबे समय तक' के आकार में अंतर डालता है।स्पष्ट रूप से कुछ 64-बिट सिस्टम 64 बिट्स के रूप में लंबे समय तक परिभाषित करते हैं, जबकि अन्य सिस्टम सी 99/सी 11 मानक को लागू करते हैं और 64 बिट्स के लिए 'लंबे समय तक' का उपयोग करते हैं, जिससे 32 बिट्स के रूप में 'लंबा' छोड़ दिया जाता है। – Lundin

+0

धन्यवाद वास्तव में एक बार मुझे लंबे समय से संबंधित समस्या मिली तो मैं सोच रहा था कि कम से कम संभव हो सकता है ... :) –

1

C99 N1256 standard draft

सब अब पक्का हम है जो:

:

2 <= sizeof(short) <= sizeof(int) 

5.2.4.2.1 पूर्णांक प्रकार के आकार <limits.h> न्यूनतम आकार देता है

1 [...] थीई आर कार्यान्वयन से परिभाषित मूल्यों बराबर या परिमाण (निरपेक्ष मूल्य) में अधिक से अधिक से पता चला उन लोगों के लिए किया जाएगा [...]

  • UCHAR_MAX 255 // 2 8 - 1
  • USHRT_MAX 65535 // 2 16 - 1
  • UINT_MAX 65535 // 2 16 - 1
  • ULONG_MAX 4294967295 // 2 32 - 1
  • ULLONG_MAX 18446744073709551615 // 2 64 - 1

6.2।5 प्रकार तो कहते हैं:

8 ही signedness और विभिन्न पूर्णांक रूपांतरण रैंक (6.3.1.1 देखें) के साथ किसी भी दो पूर्णांक प्रकार के लिए, छोटे पूर्णांक रूपांतरण रैंक के साथ प्रकार के मानों की श्रेणी एक है अन्य प्रकार के मूल्यों का सब्रेंज।

और 6.3.1.1 बूलियन, वर्ण, और पूर्णांकों निर्धारित करता है सापेक्ष रूपांतरण में शुमार है:

  • : इस प्रकार

    1 हर पूर्णांक प्रकार एक पूर्णांक रूपांतरण रैंक परिभाषित है लंबे लंबे int की रैंक लंबी int के रैंक से अधिक होगी, जो int की रैंक से अधिक होगी, जो int के रैंक से अधिक होगी, whi ch हस्ताक्षरित चार के रैंक से अधिक होगा।

  • किसी भी हस्ताक्षरित पूर्णांक प्रकार का रैंक संबंधित हस्ताक्षरित पूर्णांक प्रकार, यदि कोई हो, के रैंक के बराबर होगा।
  • सभी पूर्णांक प्रकार के लिए T1, T2, और T3, अगर टी 1 टी 2 से अधिक रैंक है और टी 2 टी 3 से अधिक से अधिक रैंक है, तो टी 1 टी 3
  • से अधिक रैंक
0

मैं पर काम कर रहा था है आज भी मेरा निष्कर्ष यह है कि यह मशीन आर्किटेक्चर की शब्द लंबाई पर निर्भर करता है जिस पर आपका प्रोग्राम निष्पादित हो रहा है। सी 99 सीमाओं के अनुसार। दस्तावेज़ीकरण।

/* Minimum and maximum values a `signed short int' can hold. */ 
# define SHRT_MIN (-32768) 
# define SHRT_MAX 32767 

/* Maximum value an `unsigned short int' can hold. (Minimum is 0.) */ 
# define USHRT_MAX 65535 

/* Minimum and maximum values a `signed int' can hold. */ 
# define INT_MIN (-INT_MAX - 1) 
# define INT_MAX 2147483647 

/* Maximum value an `unsigned int' can hold. (Minimum is 0.) */ 
# define UINT_MAX 4294967295U 

/* Minimum and maximum values a `signed long int' can hold. */ 
# if __WORDSIZE == 64 
# define LONG_MAX 9223372036854775807L 
# else 
# define LONG_MAX 2147483647L 
# endif 
# define LONG_MIN (-LONG_MAX - 1L) 

/* Maximum value an `unsigned long int' can hold. (Minimum is 0.) */ 
# if __WORDSIZE == 64 
# define ULONG_MAX 18446744073709551615UL 
# else 
# define ULONG_MAX 4294967295UL 
# endif 

अगर किसी के पास कोई बेहतर जवाब है तो मुझे बताएं।

+0

बस जोड़ने के लिए इस –

+0

लघु int i = 2147483647; \t printf ("% d% d% d \ n", i, i + 1, i + 10); –

+0

int i = 2147483647; \t printf ("% d% d% d \ n", i, i + 1, i + 10); –