2012-02-16 5 views
23

बनाम बनाम मैं बंदरगाह के लिए 64 बिट करने के लिए अपने कोड कोशिश कर रहा हूँ।int_least64_t int_fast64_t int64_t

मैंने पाया कि सी ++ 64 बिट पूर्णांक प्रकार प्रदान करता है, लेकिन मैं अभी भी इसके बारे में उलझन में हूं।

int_least64_t 
int_fast64_t 
int64_t 
intmax_t 

और उनके अहस्ताक्षरित समकक्षों:

पहले, मैं चार अलग-अलग 64 बिट int रों पाया। मैंने उन्हें sizeof() का उपयोग करके परीक्षण किया और वे 8 बाइट हैं इसलिए वे 64 बिट हैं।

क्या उन दोनों के बीच अलग है? least और fast प्रकारों का अर्थ क्या है? intmax_t के बारे में क्या?

+6

उन typedefs के बारे में जानने लायक हैं, लेकिन आप यह सुनिश्चित करें कि आप सही समस्या को देख रहे हैं? "64 बिट तक पोर्टिंग" को आमतौर पर यह आवश्यक नहीं होना चाहिए कि आप अपने प्रकार बदल दें। सबसे अच्छे मामले में आप बस पुनः संयोजित करें। –

+0

@ केरेकस्क: उत्कृष्ट बिंदु। मैंने अपना जवाब उस पते पर भी अपडेट कर दिया है। –

+0

संभावित डुप्लिकेट [intXX_t और int_fastXX_t?] के बीच क्या अंतर है (http://stackoverflow.com/questions/9239558/what-is-the-difference-between-intxx-t-and-int-fastxx-t) –

उत्तर

51

अपने प्लेटफॉर्म पर, वे सभी अंतर्निहित डेटा प्रकार के लिए सभी नाम हैं। अन्य प्लेटफार्मों पर, वे नहीं हैं।

int64_t सटीक 64 बिट्स होने की आवश्यकता है। आर्किटेक्चर पर (उदाहरण के लिए) 9-बिट बाइट, यह बिल्कुल उपलब्ध नहीं होगा।

int_least64_t कम से कम 64 बिट्स वाला सबसे छोटा डेटा प्रकार है। यदि int64_t उपलब्ध है, तो इसका उपयोग किया जाएगा। लेकिन (उदाहरण के लिए) 9-बिट बाइट मशीन के साथ, यह 72 बिट्स हो सकता है।

int_fast64_t कम से कम 64 बिट्स और सर्वोत्तम अंकगणितीय प्रदर्शन वाला डेटा प्रकार है। यह मुख्य रूप से int_fast8_t और int_fast16_t के साथ स्थिरता के लिए है, जो कई मशीनों पर 32 बिट्स, 8 या 16 नहीं होंगे। कुछ और वर्षों में, एक आर्किटेक्चर हो सकता है जहां 128-बिट गणित 64-बिट से तेज है, लेकिन मैं नहीं करता ऐसा नहीं लगता कि आज कोई अस्तित्व है।


आप एक एल्गोरिथ्म पोर्टिंग रहे हैं, तो आप शायद, int_fast32_t का उपयोग किया है, क्योंकि यह किसी भी मूल्य अपने पुराने 32-बिट कोड संभाल कर सकते हैं का आयोजन करेगा चाहते हैं, लेकिन 64-बिट हो जाएगा कि अगर तेज़ है। यदि आप पॉइंटर्स को पूर्णांक में परिवर्तित कर रहे हैं (क्यों?) तो intptr_t का उपयोग करें।

+0

+1, अच्छी व्याख्या। – ildjarn

+2

"आर्किटेक्चर पर (उदाहरण के लिए) 9-बिट बाइट, यह बिल्कुल उपलब्ध नहीं होगा।" शायद दिलचस्प उल्लेख करने के लिए कि 'intN_t' के मूल POSIX परिभाषा (C90 के लिए एक विस्तार के रूप में) की अनुमति गद्दी ताकि आप एक 72-बिट' हो सकता था int64_t' जिनमें से 8 बिट गद्दी के लिए उपयोग किया जाता है। – hvd

+0

अगर मैं गलत हूं तो मुझे सही करें: int64_t के बारे में, अगर मेरे पास 8 बिट प्लेटफॉर्म है तो यह परिभाषित होगा, और यदि मेरे पास अन्य प्लेटफ़ॉर्म है जो 64 बिट नहीं है तो यह परिभाषित नहीं होगा, क्या यह ठीक है? ; int_least64_t के बारे में: यह केवल तभी परिभाषित होगा जब मेरे पास 64 बिट प्लेटफ़ॉर्म से कम से कम या 64 बिट प्लेटफ़ॉर्म हो, लेकिन यदि 64 बिट से कम प्लेटफ़ॉर्म यह परिभाषित नहीं करेगा, तो यह सच है और अंतिम int_fast64_t डिफ़ॉल्ट है उदाहरण के लिए यदि मेरे पास 64 बिट है प्लेटफार्म इसे _int64 के रूप में परिभाषित किया जाएगा यदि मैं और इतने पर लेकिन कम से कम 8 बिट आर्किटेक्चर होने की शर्त के साथ, और धन्यवाद। – user722528

11

int64_t में 64 बिट्स हैं। यह सभी प्लेटफार्मों के लिए परिभाषित नहीं किया जा सकता है।

int_least64_t कम से कम 64 बिट्स वाला सबसे छोटा प्रकार है।

int_fast64_t वह प्रकार है जो कम से कम 64 बिट्स के साथ प्रक्रिया करने के लिए सबसे तेज़ है।

32 या 64-बिट प्रोसेसर पर, वे सभी परिभाषित किए जाएंगे, और सभी में 64 बिट होंगे। एक hypothetical 73-बिट प्रोसेसर पर, int64_t परिभाषित नहीं किया जाएगा (क्योंकि 64 बिट्स के साथ कोई प्रकार नहीं है), और अन्य 73 बिट्स होंगे।