2009-03-16 10 views
40

जब मैं अपने सी # .NET प्रोजेक्ट में sizeof(int) करता हूं तो मुझे 4 का रिटर्न वैल्यू मिलता है। मैंने प्रोजेक्ट प्रकार को x64 पर सेट किया है, तो यह 8 के बजाय 4 क्यों कहता है? क्या ऐसा इसलिए है क्योंकि मैं प्रबंधित कोड चला रहा हूं?x64 पर sizeof (int)?

+3

अप्रबंधित कोड .NET के समान निर्णय लेता है। सादा सी ++ में, आकार (int) 4 भी है। X64 के 32-बिट आर्किटेक्चर के एक्सटेंशन के रूप में सोचें। डिफ़ॉल्ट अभी भी 32 है, आप बस 64-बिट डेटा * को संसाधित करने की क्षमता प्राप्त करते हैं *। – jalf

+1

@jalf अधिक सटीक होने के लिए, हमारे पास पहले से ही 64-बिट डेटा को संसाधित करने की क्षमता थी, हालांकि मूल समर्थन के कारण x64 CPUs इसे तेज़ी से करते हैं। –

+2

यह क्यों बंद है? तकनीकी रूप से समान होने पर, दूसरा प्रश्न जावा के बारे में है, यह .NET/C# के बारे में है। –

उत्तर

36

वहाँ various 64-bit data models कर रहे हैं; माइक्रोसॉफ्ट .NET के लिए एलपी 64 का उपयोग करता है: लंबे एस और पॉइंटर्स 64-बिट्स हैं (हालांकि पारंपरिक सी-स्टाइल पॉइंटर्स मौजूद नहीं हैं .NET)। आईएलपी 64 के साथ इसकी तुलना करें जहां int एस 64-बिट भी हैं।

इस प्रकार, सभी प्लेटफ़ॉर्म पर, int 32-बिट्स और long 64-बिट्स है; आप इसे अंतर्निहित प्रकार सिस्टम.इन्ट 32 और सिस्टम.इन्ट 64 के नाम पर देख सकते हैं।

+7

आपको अपना उत्तर संपादित करना चाहिए क्योंकि यह पूरी तरह से सही करने के लिए स्वीकार किया गया है। हटाएं जहां आप कहते हैं "हालांकि पारंपरिक सी-स्टाइल पॉइंटर्स मौजूद नहीं हैं .NET" और विस्तार System.IntPtr आर्किटेक्चर पर निर्भर करता है। –

+1

आप सी # में "सी-स्टाइल" पॉइंटर्स का उपयोग कर सकते हैं, उन्हें बस असुरक्षित संदर्भ के तहत किया जाना है।"Fnieto" की तरह, आपको यह ध्यान रखना होगा कि IntPtr प्लेटफॉर्म पर निर्भर करता है, जहां x86 में "sizeof (IntPtr) == 4" और x size में "sizeof (IntPtr) == 8" है। – zezba9000

45

कीवर्ड int उपनाम System.Int32 जो अभी भी 64-बिट मशीन पर 4 बाइट्स की आवश्यकता है।

24

int का अर्थ है Int32 .NET भाषाओं में। यह 32- और 64-बिट आर्किटेक्चर के बीच संगतता के लिए किया गया था।

सी # में table of all the types और वे .NET wise के लिए मानचित्र क्या हैं।

4

याद रखें int मूल प्रकार Int32 के लिए केवल एक कंपाइलर उपनाम है। यह देखते हुए कि यह स्पष्ट होना चाहिए कि क्यों int 64 बिट प्लेटफार्म पर केवल 32 बिट्स है।

12

आप int पॉइंटर या System.IntPtr के बारे में सोच रहे हैं। यह x86 पर x64 और 4 बाइट्स पर 8 बाइट्स होगा। एक सूचक का आकार दिखाता है कि आपके स्मृति के लिए आपके पास 64-बिट पते हैं। (System.IntPtr.Size ==8 x64 पर)

int का अर्थ अभी भी 4 बाइट्स है चाहे आप x86 या x64 पर हों। यह कहना है कि int हमेशा System.Int32 से मेल खाता है।

14

एक Int32 x86 और x64 पर 4 बाइट्स है। एक Int64 8 बाइट या तो मामला है। सी # int प्रकार System.Int32 के लिए सिर्फ एक उपनाम है। दोनों रनटाइम वातावरण के तहत ही। केवल प्रकार क्रम पर्यावरण के आधार पर बदल करता है कि एक IntPtr है:

unsafe 
    { 
     var size = sizeof(IntPtr); // 4 on x86 bit machines. 8 on x64 
    } 
+4

या आप केवल IntPtr.Size की जांच कर सकते हैं, जिसे असुरक्षित कोड की आवश्यकता नहीं है। –

+0

... और UIntPtr, ज़ाहिर है। ... और असुरक्षित सूचक प्रकार। –

+0

ध्यान देने योग्य अच्छी बात: UIntPtr सीएलएस-अनुपालन नहीं है। –

2
int i; 
int size = BitConverter.GetBytes(i).Lenght; 
+3

यह सवाल 3 साल पहले पूछा गया था और पहले से ही एक स्वीकार्य उत्तर है। देखें कि क्या आप हाल के प्रश्नों के उत्तर प्रदान कर सकते हैं जिनके पास अभी तक स्वीकार्य उत्तर नहीं है। – mcknz

+1

मुझे लगता है कि यह समर्पित है क्योंकि "लेनघट" जाहिर है – Laie

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