जब मैं अपने सी # .NET प्रोजेक्ट में sizeof(int)
करता हूं तो मुझे 4 का रिटर्न वैल्यू मिलता है। मैंने प्रोजेक्ट प्रकार को x64 पर सेट किया है, तो यह 8 के बजाय 4 क्यों कहता है? क्या ऐसा इसलिए है क्योंकि मैं प्रबंधित कोड चला रहा हूं?x64 पर sizeof (int)?
उत्तर
वहाँ various 64-bit data models कर रहे हैं; माइक्रोसॉफ्ट .NET के लिए एलपी 64 का उपयोग करता है: लंबे एस और पॉइंटर्स 64-बिट्स हैं (हालांकि पारंपरिक सी-स्टाइल पॉइंटर्स मौजूद नहीं हैं .NET)। आईएलपी 64 के साथ इसकी तुलना करें जहां int एस 64-बिट भी हैं।
इस प्रकार, सभी प्लेटफ़ॉर्म पर, int
32-बिट्स और long
64-बिट्स है; आप इसे अंतर्निहित प्रकार सिस्टम.इन्ट 32 और सिस्टम.इन्ट 64 के नाम पर देख सकते हैं।
आपको अपना उत्तर संपादित करना चाहिए क्योंकि यह पूरी तरह से सही करने के लिए स्वीकार किया गया है। हटाएं जहां आप कहते हैं "हालांकि पारंपरिक सी-स्टाइल पॉइंटर्स मौजूद नहीं हैं .NET" और विस्तार System.IntPtr आर्किटेक्चर पर निर्भर करता है। –
आप सी # में "सी-स्टाइल" पॉइंटर्स का उपयोग कर सकते हैं, उन्हें बस असुरक्षित संदर्भ के तहत किया जाना है।"Fnieto" की तरह, आपको यह ध्यान रखना होगा कि IntPtr प्लेटफॉर्म पर निर्भर करता है, जहां x86 में "sizeof (IntPtr) == 4" और x size में "sizeof (IntPtr) == 8" है। – zezba9000
कीवर्ड int
उपनाम System.Int32
जो अभी भी 64-बिट मशीन पर 4 बाइट्स की आवश्यकता है।
int
का अर्थ है Int32
.NET भाषाओं में। यह 32- और 64-बिट आर्किटेक्चर के बीच संगतता के लिए किया गया था।
सी # में table of all the types और वे .NET wise के लिए मानचित्र क्या हैं।
याद रखें int
मूल प्रकार Int32
के लिए केवल एक कंपाइलर उपनाम है। यह देखते हुए कि यह स्पष्ट होना चाहिए कि क्यों int
64 बिट प्लेटफार्म पर केवल 32 बिट्स है।
आप int
पॉइंटर या System.IntPtr
के बारे में सोच रहे हैं। यह x86 पर x64 और 4 बाइट्स पर 8 बाइट्स होगा। एक सूचक का आकार दिखाता है कि आपके स्मृति के लिए आपके पास 64-बिट पते हैं। (System.IntPtr.Size
==8 x64 पर)
int
का अर्थ अभी भी 4 बाइट्स है चाहे आप x86 या x64 पर हों। यह कहना है कि int
हमेशा System.Int32
से मेल खाता है।
एक Int32
x86 और x64 पर 4 बाइट्स है। एक Int64
8 बाइट या तो मामला है। सी # int
प्रकार System.Int32
के लिए सिर्फ एक उपनाम है। दोनों रनटाइम वातावरण के तहत ही। केवल प्रकार क्रम पर्यावरण के आधार पर बदल करता है कि एक IntPtr
है:
unsafe
{
var size = sizeof(IntPtr); // 4 on x86 bit machines. 8 on x64
}
या आप केवल IntPtr.Size की जांच कर सकते हैं, जिसे असुरक्षित कोड की आवश्यकता नहीं है। –
... और UIntPtr, ज़ाहिर है। ... और असुरक्षित सूचक प्रकार। –
ध्यान देने योग्य अच्छी बात: UIntPtr सीएलएस-अनुपालन नहीं है। –
अप्रबंधित कोड .NET के समान निर्णय लेता है। सादा सी ++ में, आकार (int) 4 भी है। X64 के 32-बिट आर्किटेक्चर के एक्सटेंशन के रूप में सोचें। डिफ़ॉल्ट अभी भी 32 है, आप बस 64-बिट डेटा * को संसाधित करने की क्षमता प्राप्त करते हैं *। – jalf
@jalf अधिक सटीक होने के लिए, हमारे पास पहले से ही 64-बिट डेटा को संसाधित करने की क्षमता थी, हालांकि मूल समर्थन के कारण x64 CPUs इसे तेज़ी से करते हैं। –
यह क्यों बंद है? तकनीकी रूप से समान होने पर, दूसरा प्रश्न जावा के बारे में है, यह .NET/C# के बारे में है। –