मैंने अपनी 32-बिट मशीन पर एमएसवीसी 2010 में कुछ कोशिश की और पाया कि मैं अपने कार्यक्रमों में __int64 का उपयोग कर सकता हूं - जो वास्तव में काम करता है!__int64?
- यह कैसे संभव है?
मैंने अपनी 32-बिट मशीन पर एमएसवीसी 2010 में कुछ कोशिश की और पाया कि मैं अपने कार्यक्रमों में __int64 का उपयोग कर सकता हूं - जो वास्तव में काम करता है!__int64?
उसी तरह 32-बिट अंकगणित 16-बिट सिस्टम पर काम किया।
इस मामले में, यह 64-बिट संख्या को एक साथ बनाने के लिए 2 32-बिट मेमोरी पतों का उपयोग करता है। जोड़/प्रतिस्थापन आसान है, आप इसे भागों से करते हैं, केवल गॉचाचा निचले भाग से ऊपरी भाग तक ले जाने वाला होता है। गुणा/विभाजन के लिए, यह कठिन है (यानी अधिक निर्देश)।
यह स्पष्ट रूप से धीमा है, गुणा के लिए 32 बिट अंकगणितीय से थोड़ा धीमा है, लेकिन यदि आपको इसकी आवश्यकता है, तो यह आपके लिए है। और जब आप 64-बिट
प्रोसेसर
कंपाइलर में अपग्रेड करते हैं, तो यह स्वचालित रूप से बड़े शब्द आकार के साथ एक निर्देश में अनुकूलित हो जाता है।
एक 32-बिट प्रोसेसर पर 64 बिट गुणा के दृश्य स्टूडियो 2010 व्यावसायिक कार्यान्वयन, रिलीज़ मोड में संकलित है:
_allmul PROC NEAR
A EQU [esp + 4] ; stack address of a
B EQU [esp + 12] ; stack address of b
mov eax,HIWORD(A)
mov ecx,HIWORD(B)
or ecx,eax ;test for both hiwords zero.
mov ecx,LOWORD(B)
jnz short hard ;both are zero, just mult ALO and BLO
mov eax,LOWORD(A)
mul ecx
ret 16 ; callee restores the stack
hard:
push ebx
A2 EQU [esp + 8] ; stack address of a
B2 EQU [esp + 16] ; stack address of b
mul ecx ;eax has AHI, ecx has BLO, so AHI * BLO
mov ebx,eax ;save result
mov eax,LOWORD(A2)
mul dword ptr HIWORD(B2) ;ALO * BHI
add ebx,eax ;ebx = ((ALO * BHI) + (AHI * BLO))
mov eax,LOWORD(A2) ;ecx = BLO
mul ecx ;so edx:eax = ALO*BLO
add edx,ebx ;now edx has all the LO*HI stuff
pop ebx
ret 16 ; callee restores the stack
आप देख सकते हैं, यह एक बहुत सामान्य गुणा की तुलना में धीमी है।
आपको यह आश्चर्यजनक क्यों लगता है? कंपाइलर को 32-बिट मशीन पर 64-, 128- या अधिक-बिट पूर्णांक प्रकारों का समर्थन करने से रोकने के लिए कुछ भी नहीं है। संकलक 57- और 91-बिट प्रकारों का भी समर्थन कर सकता है, अगर ऐसा लगता है। अभ्यास में एन-बिट मशीन पर 2 एन-बिट पूर्णांक अंकगणित का समर्थन करना अपेक्षाकृत आसान काम है, क्योंकि एक ठेठ मशीन के निर्देश सेट को अक्सर इस तरह की कार्यक्षमता के साथ दिमाग में डिजाइन किया जाता है।
32 बिट्स केवल मशीन शब्द का मूल आकार हैं, जिसका अर्थ है कि उन्हें एक बार में संसाधित किया जा सकता है, इसका मतलब यह नहीं है कि बड़ी वस्तुओं को संसाधित नहीं किया जा सकता है, उन्हें बस 32- बिट इकाइयों को कई चरणों में, उसी तरह वे मशीन शब्द से छोटे हो सकते हैं, इस मामले में केवल पूर्ण मशीन शब्द का एक हिस्सा संसाधित किया जाएगा।
यह काम करता है क्योंकि 64-बिट पूर्णांक डेटा प्रकार भाषा विनिर्देश का हिस्सा हैं।
भाषा के लिए एक कंपाइलर आपको 64-बिट पूर्णांक के साथ काम करने देना चाहिए (और निश्चित रूप से सही परिणाम प्राप्त करें)।
आपका प्रोग्राम 64-बिट, 32-बिट, 16-बिट, या 8-बिट मशीन (जो भी संकलक अनुमति देता है) को लक्षित करता है, चाहे आप काम कर सकें (और बिल्कुल वही काम करें)।
जो कोई भी संकलक ने लिखा कि यह जो कुछ भी जरूरत हैहर समर्थित हर लक्षित प्रोसेसर प्रकार पर डेटा प्रकार काम करने के लिए करते हैं करने के लिए बाध्य किया गया था।
संभावित "उच्च" डेटा प्रकारों का समर्थन सभी को का ख्याल रखा गया है, ताकि आपको इसे स्वयं करने की आवश्यकता न हो।
कैसे?
जाहिर है, कोड है कि 16-बिट अंकगणितीय आपरेशनों आदेश को स्वीकार करने और मशीन कोड है कि एक 16-बिट (या अधिक) प्रोसेसर पर चलता है में अनुवाद एक संकलक, लगभग एक सीधा अनुवाद के लिए "आसान" काम है। Z = X + Y
mov a,(X); add a,(Y); mov (Z),a;
पर अनुवाद कर सकता है।
इसके विपरीत, कोड है कि 64-बिट अंकगणितीय आपरेशनों आदेश को स्वीकार करने और मशीन कोड है कि एक 32-बिट (या कम) प्रोसेसर पर चलता है में अनुवाद ज्यादा जटिल है। कंपाइलर को एक ही समय में प्रत्येक ऑपरेंड के 32-बिट टुकड़ों पर काम करने के लिए और अधिक काम करना पड़ता है। इसे करने के लिए और अधिक तरीके हैं।
जिसके परिणामस्वरूप मशीन कोड को कई निर्देश इनलाइन (बड़ा कोड, तेजी से निष्पादन) इस्तेमाल कर सकते हैं। Z = X + Y
mov a,(X); adc a,(Y); mov (Z),a; mov a,CARRY; adc a,(X+1); adc a,(Y+1); mov (Z+1),a;
पर अनुवाद कर सकता है।
जिसके परिणामस्वरूप मशीन कोड अंकगणित सबरूटीन्स (छोटे कोड, धीमी निष्पादन) बढ़ाया कह सकते हैं। Z = X + Y
अनुवाद कर सकते हैं mov a,X; call GET64; mov a,Y; call ADD64; mov a,Z; call STORE64;
।
तुम भी मानक int64_t इस्तेमाल कर सकते हैं! –
@ el.pescado: 'int64_t' केवल सी 99 में मानक है; यह वर्तमान में सी ++ मानक का हिस्सा नहीं है, लेकिन आने वाले सी ++ 0x में जोड़ा जाएगा। –
अभ्यास अपने 32 बिट मशीन (यानी> पेंटियम) में कुछ देशी 64 बिट समर्थन हासिल है, यह भी पता स्थान की 36bit है। यह सिर्फ खिड़कियों आप –