बहुत ही सरल सवाल, मैंने पढ़ा कि जीसीसी लंबे लंबे int प्रकार का समर्थन करता है। लेकिन सीपीयू केवल 32 बिट चौड़ा होने पर गणित के संचालन कैसे कर सकता है?32 बिट मशीनों पर लंबे समय तक int
उत्तर
कंपाइलर गणित संचालन (या फ़ंक्शन कॉल का उपयोग) संश्लेषित करेगा जो ऑपरेशन करने के लिए एक से अधिक 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-बिट मानों के लिए करना था।
कक्षा के रूप में सबसे अधिक संभावना, मूल रूप से नहीं। वैसे ही कोई भी कंपाइलर किसी भी बड़े नंबर सेट का समर्थन कर सकता/सकती है।
आंतरिक रूप से, प्रकार एक उच्च शब्द और एक कम शब्द, जैसे का प्रतिनिधित्व करती है:
struct long
{
int32 highWord;
uint32_t lowWord;
}
संकलक अगर यह एक 32bit या 64bit वातावरण है पता करने के लिए की जरूरत है और उसके बाद के अधिकार reprenstations का चयन करता है संख्या - यदि यह 64 बिट है, तो यह 32 बिट है, तो इसे मूल रूप से किया जा सकता है, संकलक को उच्च/निम्न शब्द के बीच गणित का ख्याल रखना पड़ता है।
यदि आपके पास math.h में कोई नज़र है, तो आप इसके लिए उपयोग किए गए कार्यों को देख सकते हैं, और स्वयं का उपयोग कर सकते हैं। एक अतिरिक्त नोट पर, छोटे-एंडियन और बड़े-एंडियन (see wiki) के बीच के अंतर से अवगत रहें, उपयोग ऑपरेटिंग सिस्टम पर निर्भर करता है।
एक आर्किटेक्चर कहना 32 बिट (या 64 या जो कुछ भी) आमतौर पर प्रोसेसर के सक्षम होने का अनुमान है। आम तौर पर आप केवल उस संख्या के साथ पॉइंटर्स की चौड़ाई को संदर्भित करते हैं, अंकगणित काफी अलग हो सकता है। उदा। X86 आर्किटेक्चर में 32 बिट पॉइंटर्स हैं, अधिकांश अंकगणित 32 बिट रजिस्टरों में किया जाता है, लेकिन इसमें कुछ बुनियादी 64 बिट ऑपरेशंस के लिए देशी समर्थन भी है।
आपको यह भी इंप्रेशन का पालन नहीं करना चाहिए कि मानक पूर्णांक प्रकारों में कुछ निर्धारित चौड़ाई है। विशेष रूप से लंबे समय तक कम से कम 64 बिट है लेकिन व्यापक हो सकता है। यदि आप चौड़ाई के बारे में पोर्टेबल रूप से सुनिश्चित करना चाहते हैं तो typedefs int32_t, int64_t का उपयोग करें।
आप को पता है कि जीसीसी (या किसी अन्य संकलक) लंबे समय तक आप अपने विशेष लक्ष्य मंच
यह बहुत आसान है बस संकलित करने के लिए और परीक्षण है कि क्या आपके पास के लिए विनिर्देश पर गौर करने के लिए है के साथ करता है चाहते हैं एक 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
- 1. 32 बिट int * 32 बिट int = 64 बिट int?
- 2. लंबे समय तक दो int और इसके विपरीत
- 3. सी ++ int बनाम लंबे
- 4. क्या जीसीसी लंबे समय तक int का समर्थन करता है?
- 5. 64-बिट विंडोज़ पर लंबे समय तक थोड़ा सा आकार क्या है?
- 6. 32-बिट हस्ताक्षरित पूर्णांक (बड़े एंडियन) को लंबे और पीछे
- 7. बिटवाई "और" लंबे समय तक?
- 8. क्या लंबे और लंबे समय तक पूर्णांक
- 9. लंबे डबल बनाम लंबे int
- 10. लंबे समय तक XMLGregorian कैलेंडर और लंबे समय तक
- 11. लंबे समय तक
- 12. लंबे समय तक लाइनों()
- 13. 32-बिट मेमोरी और 32-बिट प्रोसेसर
- 14. पाइथन int और लंबे समय तक कैसे प्रबंधित करता है?
- 15. 32 बिट बनाम 64 बिट
- 16. 32 बिट पूर्णांक पर 32 बिट फ्लोट को मानचित्र करें
- 17. 64 बिट आर्किटेक्चर पर 32 जीबी तक सीमित क्यों है?
- 18. लंबे समय तक आइटम हटाएं
- 19. 32 बिट
- 20. 32 बिट अनुप्रयोग से 64 बिट रजिस्ट्री तक पहुंच
- 21. कि 32 और 64-बिट
- 22. ओपनसीएल: जीपीयू पर 32-बिट और 64-बिट पॉपकंट निर्देश?
- 23. जावा: लंबे समय तक टिमस्टैम्प
- 24. लंबे समय तक कास्ट करें
- 25. जावा लंबे समय तक बाइनरी
- 26. 32 बिट से 64 बिट पर यह तेज़ क्यों है?
- 27. 12 बिट int से 16 या 32 बिट्स
- 28. पायथन: 32 बिट बिटवाइथ अंकगणित
- 29. मेरा 32-बिट एप्लिकेशन 32-बिट रजिस्ट्री हाइव तक क्यों नहीं पहुंचता है?
- 30. 32 बिट लिनक्स कर्नेल
दो अतिरिक्त चीजें: सबसे पहले, इस संरचना का क्रम मशीन ऑर्डर निर्भर है। – Joshua
दूसरा, इस संरचना पर संचालित फ़ंक्शन कॉल आपके लिए उपलब्ध हैं। उन्हें गणित में घोषित किया गया है। – Joshua
thirs 'lowByte' वास्तव में 'uint32_t' होगा: -P –