2010-06-18 18 views

उत्तर

20

कंपाइलर गणित संचालन (या फ़ंक्शन कॉल का उपयोग) संश्लेषित करेगा जो ऑपरेशन करने के लिए एक से अधिक CPU निर्देशों का उपयोग करेगा। उदाहरण के लिए, एक एड ऑपरेशन long long मानों के कम ऑर्डर घटकों (कम शब्दों) को जोड़ देगा और उसके बाद उस ऑपरेशन को पूरा कर लेगा और इसे long long के उच्च क्रम शब्दों पर एक ऐड ऑपरेशन में खिलाएगा।

तो निम्नलिखित सी कोड:

long long a; 
long long b; 
long long c; 

// ... 
c = a + b; 

एक अनुदेश अनुक्रम द्वारा प्रस्तुत किया जा सकता है कि तरह दिखता है:

mov eax, [a.low] ; add the low order words 
add eax, [b.low] 

mov edx, [a.high] ; add the high order words, 
adc edx, [b.high] ; including the carry 

mov [c.low], eax 
mov [c.high], edx 

और अगर आप एक पल के लिए विचार करें, 8 और 16 बिट के लिए compilers long long होने से पहले सिस्टम को इस प्रकार की चीज 16 और/या 32-बिट मानों के लिए करना था।

1

कक्षा के रूप में सबसे अधिक संभावना, मूल रूप से नहीं। वैसे ही कोई भी कंपाइलर किसी भी बड़े नंबर सेट का समर्थन कर सकता/सकती है।

9

आंतरिक रूप से, प्रकार एक उच्च शब्द और एक कम शब्द, जैसे का प्रतिनिधित्व करती है:

struct long 
{ 
    int32 highWord; 
    uint32_t lowWord; 
} 

संकलक अगर यह एक 32bit या 64bit वातावरण है पता करने के लिए की जरूरत है और उसके बाद के अधिकार reprenstations का चयन करता है संख्या - यदि यह 64 बिट है, तो यह 32 बिट है, तो इसे मूल रूप से किया जा सकता है, संकलक को उच्च/निम्न शब्द के बीच गणित का ख्याल रखना पड़ता है।

यदि आपके पास math.h में कोई नज़र है, तो आप इसके लिए उपयोग किए गए कार्यों को देख सकते हैं, और स्वयं का उपयोग कर सकते हैं। एक अतिरिक्त नोट पर, छोटे-एंडियन और बड़े-एंडियन (see wiki) के बीच के अंतर से अवगत रहें, उपयोग ऑपरेटिंग सिस्टम पर निर्भर करता है।

+1

दो अतिरिक्त चीजें: सबसे पहले, इस संरचना का क्रम मशीन ऑर्डर निर्भर है। – Joshua

+0

दूसरा, इस संरचना पर संचालित फ़ंक्शन कॉल आपके लिए उपलब्ध हैं। उन्हें गणित में घोषित किया गया है। – Joshua

+0

thirs 'lowByte' वास्तव में 'uint32_t' होगा: -P –

2

एक आर्किटेक्चर कहना 32 बिट (या 64 या जो कुछ भी) आमतौर पर प्रोसेसर के सक्षम होने का अनुमान है। आम तौर पर आप केवल उस संख्या के साथ पॉइंटर्स की चौड़ाई को संदर्भित करते हैं, अंकगणित काफी अलग हो सकता है। उदा। X86 आर्किटेक्चर में 32 बिट पॉइंटर्स हैं, अधिकांश अंकगणित 32 बिट रजिस्टरों में किया जाता है, लेकिन इसमें कुछ बुनियादी 64 बिट ऑपरेशंस के लिए देशी समर्थन भी है।

आपको यह भी इंप्रेशन का पालन नहीं करना चाहिए कि मानक पूर्णांक प्रकारों में कुछ निर्धारित चौड़ाई है। विशेष रूप से लंबे समय तक कम से कम 64 बिट है लेकिन व्यापक हो सकता है। यदि आप चौड़ाई के बारे में पोर्टेबल रूप से सुनिश्चित करना चाहते हैं तो typedefs int32_t, int64_t का उपयोग करें।

आप को पता है कि जीसीसी (या किसी अन्य संकलक) लंबे समय तक आप अपने विशेष लक्ष्य मंच

2

यह बहुत आसान है बस संकलित करने के लिए और परीक्षण है कि क्या आपके पास के लिए विनिर्देश पर गौर करने के लिए है के साथ करता है चाहते हैं एक 32-बिट सिस्टम सुलभ। जीसीसी में ध्वज -S है जो असेंबली भाषा आउटपुट चालू करता है। यहां मेरे 32-बिट इंटेल पर यह उत्पन्न होता है:

// read two long longs from stack into eax:edx and ecx:ebx 
movl 32(%esp), %eax 
movl 36(%esp), %edx 
movl 24(%esp), %ecx 
movl 28(%esp), %ebx 
// a+b 
addl %ecx, %eax 
adcl %ebx, %edx 
// a-b 
subl %ecx, %eax 
sbbl %ebx, %edx 
// etc 
संबंधित मुद्दे