2012-04-17 11 views
45

संभव डुप्लिकेट:
size of int, long, etc
Does the size of an int depend on the compiler and/or processor?
What decides the sizeof an integer?64-बिट मशीन पर आकार (int) क्या होना चाहिए?

मैं एक 64-bit मशीन का उपयोग कर रहा हूँ।

$ uname -m 
x86_64 
$ file /usr/bin/file 
/usr/bin/file: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped 
$ 

जब मैं निम्नलिखित प्रोग्राम भाग गया, मैं 4-bytes रूप sizeof(int) मिला है।

#include <stdio.h> 

int main(void) 
{ 
    printf("sizeof(int) = %d bytes\n", (int) sizeof(int)); 

    return 0; 
} 

मैं एक 16-, 32- और 64- बिट मशीन चल रहा हूँ, तो यह मतलब नहीं है कि एक integer के आकार 16-, 32- और 64- बिट क्रमशः है?

मेरी मशीन में, मुझे WORD_BIT32 मिला। मशीन पर 64 नहीं होना चाहिए?

$ getconf WORD_BIT 
32 
$ 

और, sizeof(int)64-bits (8 bytes) उपरोक्त मामले में नहीं किया जाना चाहिए?

+3

मैं एक सी व्यक्ति नहीं हूँ, लेकिन मेरा मानना ​​है कि 'char' के अलावा कुछ के आकार संकलक-विशिष्ट है, और यह भी जरूरी प्रोसेसर पर एक शब्द का आकार नहीं है। – Ryan

+0

http://stackoverflow.com/questions/589575/size-of-int-long-etc – Perception

+1

@minitech: चार भी विशिष्ट – Dani

उत्तर

35

होना जरूरी नहीं है है; "64-बिट मशीन" का अर्थ कई चीजें हो सकता है, लेकिन आम तौर पर इसका मतलब है कि सीपीयू के पास बड़े रजिस्ट्रार हैं। एक प्रकार का आकार संकलक द्वारा निर्धारित किया जाता है, जिसे वास्तविक हार्डवेयर के साथ कुछ भी करने की ज़रूरत नहीं है (हालांकि यह आमतौर पर करता है); वास्तव में, एक ही मशीन पर विभिन्न कंपाइलरों के लिए अलग-अलग मूल्य हो सकते हैं।

20

वास्तव में नहीं। पिछड़े संगतता के लिए यह 32 बिट्स है।
आप 64 बिट्स चाहते हैं तो आप long, size_t या int64_t

+12

'long' विंडोज 64 पर 4 बाइट्स नहीं है। –

+18

@ जोनाथन लेफ्लर: सामान्य सिस्टम पर – Dani

+10

@Dani 64-बिट विंडोज़ के बारे में असामान्य क्या है? लिनक्स और विंडोज़ अपने 64-बिट कार्यान्वयन के लिए विभिन्न [डेटा मॉडल] (https://en.wikipedia.org/wiki/64-bit#64-bit_data_models) को लागू करना चुनते हैं, जो दूसरे की तुलना में एक सामान्य नहीं बनाते हैं। – Praetorian

6

सी ++ में, int का आकार स्पष्ट रूप से निर्दिष्ट नहीं है। यह आपको बताता है कि यह कम से कम short int का आकार होना चाहिए, जो कम से कम signed char जितना बड़ा होना चाहिए। बिट्स में char का आकार स्पष्ट रूप से निर्दिष्ट नहीं है, हालांकि आकार (char) को 1 के रूप में परिभाषित किया गया है। यदि आप 64 बिट int चाहते हैं, तो C++ 11 कम से कम 64 बिट्स होने के लिए long long निर्दिष्ट करता है। एक सूचक की

+1

'char' का आकार निर्दिष्ट नहीं है स्पष्ट रूप से भ्रामक है। 'sizeof (char) 'परिभाषा के अनुसार 1 है (इसलिए एक char एक बाइट है)। एकमात्र "आकार" जो भिन्न होता है वह बिट्स की संख्या है: 'CHAR_BITS', जो कम से कम 8 है। यह भी ध्यान दें कि बाइट में 8 से अधिक बिट्स हो सकते हैं। – Anthales

+0

आपको 'sizeof' ऑपरेटर के बारे में अर्थशास्त्र देखने की आवश्यकता है। चूंकि मेरे पास सी ++ मानक दस्तावेज़ नहीं है, इसलिए मैं केवल आपको बता सकता हूं कि सी 99 को इसके बारे में क्या कहना है (और मुझे पता है कि सी ++ इस पर सहमत है): "'आकार' ऑपरेटर अपने ऑपरेंड के आकार (बाइट्स में) उत्पन्न करता है। " और "जब एक ऑपरेंड पर लागू होता है जिसमें 'char',' unsigned char', या 'हस्ताक्षरित char', (या इसके योग्य संस्करण) का परिणाम होता है तो परिणाम 1" – Anthales

+0

@ एंथलेस आप बिल्कुल सही हैं, §5.3.3 सी ++ 11 मानक में। यह बात बताने के लिए धन्यवाद। – juanchopanza

48

आकार किसी भी 64-बिट C/C++ संकलक पर 8 बाइट, लेकिन जरूरी नहीं कि पूर्णांक के आकार होना चाहिए।

+9

यह एक महत्वपूर्ण अवलोकन है। 32-बिट आर्किटेक्चर पर पॉइंटर्स 32 बिट चौड़े हैं जिसका अर्थ है कि वे 4 जीबी से अधिक मेमोरी को संबोधित नहीं कर सकते हैं। –

+0

64 बी कंपाइलर की परिभाषा क्या है? यदि पता स्थान 4 जीबी 32 बी पॉइंटर्स तक सीमित है तो ठीक काम करेगा। – XTF

+0

@XTF दाएं, और ** x32 ** एक वास्तविक चीज़ है जो मौजूद है: 64-बिट CPUs के लिए एक आर्किटेक्चर लेकिन 32-बिट पॉइंटर्स के साथ, 'int' और 'long's: https: //wiki.debian .org/X32Port –

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