सवाल लंबे और int डेटा प्रकारों के बीच अंतर [डुप्लिकेट]


इस प्रश्न का उत्तर यहां दिया गया है:

यह देखते हुए कि निम्नलिखित कथन वापस आते हैं 4, के बीच क्या अंतर है int तथा long सी ++ में प्रकार?

sizeof(int)
sizeof(long)

44
2018-05-22 22:17


मूल


पूछे और जवाब दिया: stackoverflow.com/questions/271076/... - Martin York


जवाब:


से इस संदर्भ:

एक int मूल रूप से होने का इरादा था   के "प्राकृतिक" शब्द का आकार   प्रोसेसर। कई आधुनिक प्रोसेसर कर सकते हैं   बराबर के साथ विभिन्न शब्द आकार संभाल लें   कम।

इसके अलावा, यह बिट:

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


51
2018-05-22 22:20



वह संदर्भ क्या है? संदर्भ का उपयोग नहीं कर सकते हैं। धन्यवाद। - allenlinli


मानक की गारंटी देता है कि आप इस तरह जाते हैं:

1 == sizeof(char) <= sizeof(short) <= sizeof (int) <= sizeof(long) <= sizeof(long long)

तो यह पूरी तरह से मान्य है sizeof (int) तथा sizeof (long) बराबर होना, और कई प्लेटफॉर्म इस दृष्टिकोण के साथ जाने का विकल्प चुनते हैं। आपको कुछ प्लेटफार्म मिलेंगे जहां int 32 बिट्स है, long 64 बिट्स है, और long long 128 बिट्स है, लेकिन यह बहुत आम लगता है sizeof (long) 4 होना

(ध्यान दें कि long long सी 99 के बाद से सी में मान्यता प्राप्त है, लेकिन आमतौर पर सी ++ 11 से पहले सी ++ में विस्तार के रूप में लागू किया गया था।)


40
2018-05-22 22:59



यह जानकारी का एक उपयोगी बिट है। प्रोसेसर + कंपाइलर्स हैं जहां आकार (char)! = Sizeof (छोटा)। विवरण अब थोड़ा आलसी हो रहे हैं, लेकिन मेरा मानना ​​है कि जिस पर एक प्रोसेसर मैंने काम किया है वह 16 बिट से कम नहीं हो सकता है। कंपाइलर को आकार (char) == 1 बनाने के लिए बहुत सारे काम करना पड़ता था। - Craig Lewis
@ क्राइग लुईस: आपका मतलब है "... कहां sizeof(char)==sizeof(short)", सही बात? - Walter Tross
मेरा मानना ​​है कि कुछ क्रे मशीनों में था sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int) && sizeof(int) == 1 , और वह आकार कम से कम 32 बिट्स था। - Jonathan Leffler
क्रे मशीनें, विशेष रूप से क्रे एसवी 1 दिलचस्प थीं। उनके पास 8 बिट वर्ण थे। एक एकल घोषित करने से पूरे 64 बिट शब्द पर कब्जा होगा और कुछ जगह बर्बाद हो जाएगी। संरचना में वर्णों या एकाधिक वर्णों की एक सरणी के लिए संकलक स्वचालित रूप से 64 बिट शब्दों में 8 बिट वर्णों को पैक करेगा। चार पॉइंटर्स अन्य पॉइंटर्स की तुलना में भी बड़े थे, उन्हें 64 बिट शब्द का पता संग्रह करना था, साथ ही साथ पैक किए गए शब्द में शब्द कहां था। - Raphael Addile


आप 32-बिट मशीन या 64-बिट विंडोज मशीन पर हैं। मेरी 64-बिट मशीन पर (यूनिक्स-व्युत्पन्न ओ / एस चल रहा है, विंडोज नहीं) sizeof(int) == 4, परंतु sizeof(long) == 8

वे अलग-अलग प्रकार होते हैं - कभी-कभी एक दूसरे के समान आकार, कभी-कभी नहीं।

(वास्तव में पुराने दिनों में, sizeof(int) == 2 तथा sizeof(long) == 4 - हालांकि सी ++ अस्तित्व से पहले दिन हो सकता है, इसके बारे में सोचने के लिए आओ। फिर भी, तकनीकी रूप से, यह एक वैध विन्यास है, यद्यपि एम्बेडेड स्पेस के बाहर असामान्य है, और एम्बेडेड स्पेस में भी संभवतः असामान्य है।)


17
2018-05-22 22:21



ध्यान दें कि यह कंपाइलर के साथ ही मशीन पर निर्भर करता है। एमएसवीसी में, 64 बिट विंडोज़ पर आकार (लंबा) == 4 भी। - Steve Jessop
बेशक - लेकिन मैं 64-बिट विंडोज मशीन का उपयोग नहीं कर रहा हूं। लेकिन हाँ, मेरा बयान "आप 32-बिट मशीन पर हैं" बहुत व्यापक है; यह "आप 32-बिट मशीन या विंडोज मशीन पर हो सकते हैं" जो कि पैडेंटिक रूप से सटीक होगा। - Jonathan Leffler
मुझे नहीं लगता कि आपका पहला बयान एक उचित अनुमान के रूप में गलत था। मुझे चिंता है कि दूसरा व्यक्ति लोगों को गलत तरीके से सोचने का कारण बन सकता है कि आपकी मशीन 8 बिट्स आपकी मशीन के 64 बिट होने के एक आवश्यक परिणाम के रूप में होती है, जब वास्तव में यह आपके कंपाइलर की परिस्थिति संबंधी संपत्ति होती है। - Steve Jessop
64 बिट विंडोज़ पर बहुत से लोग हैं। यह उन लोगों का एक बहुत बड़ा समूह है जिनके लिए आपने गलत आकार दिया है sizeof(long), जो शायद ही पेडेंटिक है। तो मैं स्टीव के साथ हूँ। - Cookie
@ कुकी: 200 9 में, बहुत कम लोग 64-बिट विंडोज का उपयोग कर रहे थे। इन दिनों, 64-बिट विंडोज का उपयोग कर रहे बहुत से लोग हैं। - Jonathan Leffler


प्लेटफार्मों पर जहां दोनों के पास एक ही आकार है, जवाब कुछ भी नहीं है। वे दोनों हस्ताक्षरित 4 बाइट मूल्यों का प्रतिनिधित्व करते हैं।

हालांकि आप इस पर भरोसा नहीं कर सकते हैं। लंबे और int का आकार निश्चित रूप से मानक द्वारा परिभाषित नहीं किया जाता है। कंपेलरों के लिए विभिन्न आकार देने के लिए यह संभव है और इसलिए इस धारणा को तोड़ दें।


4
2018-05-22 22:18





लंबे समय तक कम से कम एक ही आकार, और संभवतः, लेकिन जरूरी नहीं, जितना लंबा होना चाहिए।

सामान्य 32-बिट सिस्टम पर, int और long दोनों 4-बाइट / 32-बिट हैं, और यह C ++ spec के अनुसार मान्य है।

अन्य प्रणालियों पर, int और लंबे समय तक दोनों एक अलग आकार हो सकते हैं। मैं एक मंच पर काम करता था जहां int 2-बाइट था, और लंबे समय तक 4-बाइट था।


3
2018-05-22 22:23





एक सामान्य सर्वोत्तम अभ्यास लंबे / int / छोटा सीधे उपयोग नहीं कर रहा है। इसके बजाए, कंपाइलर्स और ओएस के विनिर्देश के अनुसार, उन्हें हेडर फ़ाइल में लपेटें ताकि यह सुनिश्चित किया जा सके कि वे वास्तव में आपके इच्छित बिट्स की मात्रा रखते हैं। फिर लंबे / int / short के बजाय int8 / int16 / int32 का उपयोग करें। उदाहरण के लिए, 32 बिट लिनक्स पर, आप इस तरह के एक शीर्षलेख को परिभाषित कर सकते हैं

typedef char int8;
typedef short int16;
typedef int int32;
typedef unsigned int uint32;

2
2018-05-28 01:44



उन्हें परिभाषित करने की कोई आवश्यकता नहीं है; वे पहले से ही मानक हेडर फ़ाइल में शामिल हैं <cstdint>, यहाँ देखें: en.cppreference.com/w/cpp/types/integer - jogojapan
@jogojapan हाँ, यदि संभव हो तो हमें हमेशा मानक परिभाषाओं को प्राथमिकता देना चाहिए। लेकिन अगर कोड को पुराने ओएस / कंपाइलर पर संकलन करने के लिए पर्याप्त संगतता की आवश्यकता है, तो मैन्युअल रूप से ऐसी सामग्री को कोडिंग करने से यह सुनिश्चित होगा। प्रत्येक विकल्प में कुछ सामान और बुरे हैं :) - fwlx