2009-05-03 6 views
7

बस पर OSX इस देखा है और मैं इसे उत्सुक मैं पूर्णांक से भी बड़ा होने के लिए लंबे समय से अपेक्षित रूप से पाया जाता है। क्या उन्हें एक ही आकार बनाने के लिए कोई अच्छा कारण है?मुझे लगता है कि इनट्स और लम्बे समय के समान आकार हैं। क्यूं कर?

उत्तर

14

यह सी और सी ++ भाषा विनिर्देशों में आकार परिभाषाओं की ढीली प्रकृति का परिणाम है। मेरा मानना ​​है कि सी विशिष्ट न्यूनतम आकार है, लेकिन सी ++ में केवल नियम यह है:

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

इसके अलावा, sizeof(int) और sizeof(long) सभी प्लेटफार्मों पर एक ही आकार नहीं हैं। हर 64-बिट मंच के साथ मैं long पड़ा है काम किया है एक 64-बिट वास्तुकला पर, प्राकृतिक शब्द के आकार के एक 32-बिट वास्तुकला पर तो 32 बिट, और 64 बिट्स।

+3

अफैइक विंडोज 64-बिट एक अपवाद है। यह एलएलपी 64 है, इसलिए वहां लंबा = 32-बिट और लम्बाई 64-बिट है। यह उस पर निर्भर करता है जो आप सोचते हैं कि कार्यान्वयनकर्ता के रूप में अधिक महत्वपूर्ण है, आकार (लंबा) = आकार (सूचक) या बचाव कोड जो आकार (लंबा) = आकार (int) मानता है। एमएस ने आखिरी के लिए चुना। –

+0

मार्को वैन डी वोर्ट एक अच्छा मुद्दा बनाता है। समय पर वापस जाकर, 16-बिट मशीनों पर, int आमतौर पर उतना ही छोटा आकार था, और लंबा, बड़ा 32-बिट आकार था। तो, एक बड़े पर्याप्त परिप्रेक्ष्य के साथ, इस बात के बारे में कोई निश्चित नियम नहीं है कि एक ही आकार के रूप में क्या है - 16-बिट लघु, 32-बिट int और 64-बिट लंबे मान वाले मशीनें थीं, मुझे विश्वास है, हालांकि वे बहुत नहीं थे लोकप्रिय क्योंकि अधिकांश कोड माना जाता है (आकार का int == आकार छोटा छोटा || आकार का int == आकार लंबा) && छोटा आकार! = आकार लंबा। –

3

int आर्किटेक्चर का प्राकृतिक शब्द आकार माना जाता है। पुराने दिनों में, मूल आईबीएम पीसी की तरह 16 बिट मशीनों पर, 16 बिट्स और लंबे समय तक 32 बिट्स थे। 68000 श्रृंखलाओं की तरह 32 बिट मशीनों पर, इनट्स अभी भी "प्राकृतिक शब्द आकार" थे, जो अब 32 बिट्स थे, और लंबे समय तक 32 बिट्स पर बने रहे। समय के साथ, देशांतर 64 बिट्स होने की वृद्धि हुई है, और फिर हम इंटेल कोर 2 की तरह 64 बिट आर्किटेक्चर का उपयोग शुरू किया, और इसलिए मैं पूर्णांक अभी या बाद में 64 बिट्स के लिए विकसित करने के लिए उम्मीद है।

दिलचस्प तथ्य: कोर 2 डुओ और मैक ओएस एक्स 10.5 के साथ, मेरे लैपटॉप पर, int और long 32 बिट्स दोनों हैं। मेरे लिनक्स बॉक्स पर, कोर 2 डुओ और उबंटू के साथ, int 32 बिट्स और 64 बिट्स लंबा है।

साल पहले, मुझे नौकरी साक्षात्कार में पूछा गया था जहां एक 3 सूचकांक जोड़ने के बाद एक इंट पॉइंटर होगा। मैंने जवाब दिया "3 बार आकार (int) अतीत जहां यह अब है"। साक्षात्कारकर्ता मुझे दबाया, और मैं ने कहा कि यह वास्तुकला पर निर्भर करेगा, क्योंकि (उस समय) Windows 16 बिट ints थे, लेकिन बाद से मैं यूनिक्स प्रोग्रामिंग कर रहा था मैं और अधिक 32 बिट ints इस्तेमाल किया गया था। मुझे नौकरी नहीं मिली - मुझे संदेह है कि साक्षात्कारकर्ता को इस तथ्य को पसंद नहीं आया कि मैं उससे ज्यादा जानता था।

+1

मुझे नहीं लगता कि int कोर 2 पर 64 बिट्स है। मुझे लगता है कि यह बहुत लंबा है कि उगाया गया है। कम से कम, यह 64-बिट डेबियन पर मेरा अनुभव रहा है। – Tom

+0

आप सही हैं, टॉम, मेरे मैकबुकप्रो पर int और long दोनों 4 बाइट हैं। –

+1

यह हार्डवेयर नहीं बल्कि कंपोजर चुनता है जो चुनता है। सटीक उसी हार्डवेयर में ओएस और कंपाइलर के आधार पर अलग-अलग int और लंबे आकार हो सकते हैं। इंटेल कोर 2 जोड़ी पर मैकॉक्स में जीसीसी डिफ़ॉल्ट रूप से 32 बिट int/long उत्पन्न करेगा। -एम 64 विकल्प के साथ 32 बी int और 64b लंबा (और सूचक) उत्पन्न होगा। –

8
  • int अनिवार्य रूप से सबसे सुविधाजनक और कुशल पूर्णांक प्रकार
  • long है/था सबसे बड़ा पूर्णांक प्रकार
  • shortछोटी से छोटी पूर्णांक प्रकार

तो है सबसे लंबा पूर्णांक प्रकार भी सबसे कुशल है, intlong जैसा ही है। एक समय पहले प्लेटफॉर्म के बाद से 16 बिट व्यापक प्राकृतिक पूर्णांक था की एक संख्या पर (लगता है पूर्व 32 बिट), sizeof(int) == sizeof(short)

+1

char एक पूर्णांक प्रकार है, और यह आमतौर पर छोटा से छोटा होता है। –

+0

char थोड़ा अजीब है ... अपने आप में, कार्यान्वयन परिभाषित परिभाषित किया गया है, इसलिए यह एक अजीब प्रकार का पूर्णांक है। "Char c = -1; int i = c; हस्ताक्षरित u = c;" पर विचार करें। मैं और आप के मूल्य कार्यान्वयन परिभाषित हैं। मैं इस बात से सहमत हूं कि दोनों "हस्ताक्षरित चार" और "हस्ताक्षरित चार" पूर्णांक प्रकार हैं;) –

+0

64-बिट सिस्टम पर अभी भी 32-बिट लंबा है, इसलिए यह सबसे बड़ा पूर्णांक प्रकार नहीं है, जैसे छोटा छोटा नहीं है । :) – jalf

1

int और long हमेशा एक ही आकार नहीं हैं, इसलिए यह न मानें कि वे कोड में हैं। ऐतिहासिक रूप से 8 बिट और 16 बिट, साथ ही साथ 32 बिट और 64 बिट आर्किटेक्चर अधिक परिचित हैं। एम्बेडेड सिस्टम के लिए छोटे शब्द आकार अभी भी आम हैं। बहुत अधिक जानकारी के लिए आईएलपी 32 और एलपी 64 के लिए नेट खोजें।

+0

और LLP64, योजना win64 –

3

जैसा कि टॉम सही ढंग से इंगित करता है, सी ++ में एकमात्र मानक आकार चार है, जिसका आकार 1 (*) है। वहां से, केवल 'छोटे से' संबंधों के बीच संबंधों के बीच नहीं है। अधिकांश लोग दावा करेंगे कि यह वास्तुकला पर निर्भर करता है, लेकिन यह एक कंपाइलर/ओएस निर्णय से अधिक है। मैकोज़क्स, विंडोज (32/64 बिट्स) या लिनक्स (32/64) के समान हार्डवेयर के समान डेटा प्रकारों के लिए अलग-अलग आकार होंगे। एक ही वास्तुकला और ओएस में विभिन्न compilers विभिन्न आकारों हो सकता है।एक ही हार्डवेयर पर एक ही ओएस पर भी ठीक उसी संकलक संकलन झंडे के आधार पर अलग अलग आकार हो सकता है:

$ cat test.cpp 
#include <iostream> 
int main() 
{ 
    std::cout << "sizeof(int): " << sizeof(int) << std::endl; 
    std::cout << "sizeof(long): " << sizeof(long) << std::endl; 
} 
$ g++ -o test32 test.cpp; ./test32 
sizeof(int): 4 
sizeof(long): 4 
$ g++ -o test64 test.cpp -m64; ./test64 
sizeof(int): 4 
sizeof(long): 8 

MacOSX तेंदुए पर जीसीसी संकलक का उपयोग कर का परिणाम है कि। जैसा कि आप हार्डवेयर और सॉफ्टवेयर देख सकते हैं वही है और फिर भी आकार एक ही कोड से पैदा हुए दो निष्पादन योग्यों पर भिन्न होता है।

यदि आपका कोड आकारों पर निर्भर करता है, तो आप डिफ़ॉल्ट प्रकारों का उपयोग नहीं कर सकते हैं, लेकिन आपके कंपाइलर के लिए विशिष्ट प्रकार जो स्पष्ट आकार बनाते हैं। या कुछ पोर्टेबल पुस्तकालयों का उपयोग करना जो उस समर्थन की पेशकश करते हैं, एसीई के साथ एक उदाहरण के रूप में: संकलक/ओएस/आर्किटेक्चर के बावजूद ACE_UINT64 64 बिट्स का एक हस्ताक्षरित पूर्णांक प्रकार होगा। पुस्तकालय संकलक और पर्यावरण का पता लगाएगा और प्रत्येक प्लेटफ़ॉर्म पर उपयुक्त डेटा प्रकार का उपयोग करेगा।

(*) मैंने सी ++ मानक को फिर से जांच लिया है 3.9.1: चार आकार 'कार्यान्वयन के मूल चरित्र सेट के किसी भी सदस्य को स्टोर करने के लिए पर्याप्त' होगा। बाद में: 5.3.3: आकार (चार), आकार (हस्ताक्षरित चार) और आकार (हस्ताक्षरित चार) 1 हैं, इसलिए हाँ, एक char का आकार 1 बाइट है।

अन्य उत्तरों पढ़ने के बाद मुझे एक ऐसा पाया गया जिसमें कहा गया है कि बूल सबसे छोटा पूर्णांक प्रकार है। फिर, मानक आवश्यकताओं में ढीला है और केवल यह बताता है कि यह सच और झूठी का प्रतिनिधित्व कर सकता है लेकिन यह आकार नहीं है। मानक उस सीमा तक स्पष्ट है: 5.3.3, फुटनोट: "आकार (बूल) 1 होना आवश्यक नहीं है"।

ध्यान दें कि कुछ सी ++ कार्यान्वयन ने अन्य कारणों से 1 बाइट से बड़े बूल का उपयोग करने का निर्णय लिया है। जीसीसी के साथ ऐप्पल मैकॉक्स पीपीसी सिस्टम में, sizeof(bool)==4

+1

sizeof (चार) है का उपयोग करता है हमेशा 1. हालांकि, वर्ण (नहीं ओकटेट) की संख्या में sizeof परिणाम लौटाता है। CHAR_BIT उदाहरण हो सकता है 32. –

+0

5.3.3 के अनुसार: "आकार का ऑपरेटर अपने ऑपरेंड के ऑब्जेक्ट प्रस्तुति में बाइट्स की संख्या उत्पन्न करता है।" –

+1

ध्यान दें कि सी या सी ++ मानकों तक 'बाइट्स' का संबंध है, octets होने की आवश्यकता नहीं है। यही कारण है कि एक बाइट में बिट्स की वास्तविक संख्या देने के लिए एक CHAR_BIT मैक्रो है (जिसे कम से कम 8 होना चाहिए) – bdonlan

संबंधित मुद्दे