int32
को 64-बिट native int
पर जोड़ते समय, क्या सीएलआर साइन-विस्तार या शून्य-32-बिट पूर्णांक का विस्तार करता है? और सबसे महत्वपूर्ण बात यह है कि यह किस विकल्प पर आधारित है?एक 64-बिट देशी int में int32 जोड़ने का परिणाम?
मैं एक .NET संकलक लिख रहा हूँ और ECMA विनिर्देश तरह से पढ़ा है, लेकिन एक जवाब नहीं मिल सका। int32
, int64
, और native int
:
CLI मूल्यांकन के ढेर पर संग्रहीत मूल्यों पर अपने अभियान में इन प्रकार के केवल एक सबसेट का समर्थन करता है।
- ECMA 335, खंड- I 12.1: समर्थित डेटा प्रकार
मूल्यांकन स्टैक पर मूल्यों के बाद से उनके signedness पर कोई जानकारी नहीं है, जिसके लिए निर्देश ऑपरेंड के signedness बात दो प्रकार हैं: के लिए एक हस्ताक्षरित और एक हस्ताक्षरित पूर्णांक के लिए एक। add
, sub
और mul
निर्देश (जो ओवरफ़्लो की जांच नहीं करते हैं) ऑपरेटरों की हस्ताक्षर की परवाह करने की आवश्यकता नहीं है जब तक कि ऑपरेंड एक ही आकार के होते हैं, और इसलिए केवल एक ही संस्करण होता है। हालांकि, ऑपरेंड हमेशा एक ही आकार नहीं कर रहे हैं ...
ECMA 335, धारा III 1.5: ओपेरैंड प्रकार तालिका कहा गया है कि एक int32
और एक native int
, जोड़ा जा सकता है घटाया, गुणा और विभाजित। नतीजा फिर से native int
है। 64-बिट सिस्टम पर, native int
64 बिट चौड़ा है।
ldc.i4.0 // Load int32 0
conv.i // Convert to (64-bit) native int
ldc.i4.m1 // Load int32 -1
add // Add native int 0 and int32 0xFFFFFFFF together
तो परिणाम क्या होगा? ध्यान दें कि, विनिर्देश के अनुसार, रनटाइम को सटीक प्रकार या स्टैक पर मानों की हस्ताक्षर को ट्रैक करने की आवश्यकता नहीं है: यह केवल int32
, int64
और native int
(और कुछ अन्य जो यहां प्रासंगिक नहीं हैं) को जानता है।
मैं कल्पना कर सकते हैं कि IntPtr
और UIntPtr
अंकगणित, क्योंकि यह आंतरिक रूप से देशी ints के रूप में प्रस्तुत किया जाता है, यह भी इसके अलावा इस तरह का प्रयोग करेंगे। हालांकि, आईएलएसपी से पता चलता है कि IntPtr
और Int32
सी # में ओवरलोडेड + ऑपरेटर IntPtr
क्लास पर कॉल करता है, जो केवल हस्ताक्षरित Int32
तर्क स्वीकार करता है।
इसे सीधे सीआईएल में करना (add
निर्देश का उपयोग करके) यह भी इंगित करता है कि पूर्णांक को हस्ताक्षर किए जाने के रूप में व्याख्या किया जाता है। इसे मोनो में भी लागू किया जाना चाहिए था, लेकिन मुझे अपने निष्कर्षों को वापस करने के लिए कोई संदर्भ नहीं मिला।
प्रचारित मूल्य के लिए चिह्न पकड़ा नहीं जाएगा। संभावित समाधानों के लिए यह जानकारी देखें (यह मैक के लिए है लेकिन इससे इस मामले में कोई फर्क नहीं पड़ता): https://developer.apple.com/library/mac/#documentation/Darwin/Conceptual/64bitPorting/MakingCode64-BitClean/MakingCode64- BitClean.html – K3N