2012-03-07 9 views
7

मुझे 40-बिट बाइनरी संख्या का प्रतिनिधित्व करने की आवश्यकता है। इसे संभालने के लिए कौन सी सी डेटाटाइप का उपयोग किया जाना चाहिए?कौन सा सी डेटाटाइप 40-बिट बाइनरी संख्या का प्रतिनिधित्व कर सकता है?

+5

+1 अनदेखा डाउनवॉट्स को ऑफ़सेट करने के लिए +1। –

+0

ऐसा लगता है कि 2 डाउनवॉटर आपको +3 (+1 टिप्पणी पर 5 + 1 से निर्णय लेते हैं) :-) –

+0

गैर पोर्टेबल, लेकिन कई टीआई डीएसपी पर [लंबा 40-बिट प्रकार है] (http: // stackoverflow .com/a/28352310/995714) इस उद्देश्य के लिए इतने लंबे समय तक उपयोग किया जा सकता है। अधिकांश पीओएसईक्स सिस्टमों में लंबे समय तक 64 बिट्स हैं और –

उत्तर

9

आप एक C99 या C11 अनुरूप संकलक उपयोग कर रहे हैं देखते हैं, तो अधिकतम संगतता के लिए int_least64_t का उपयोग करें। या, यदि आप एक हस्ताक्षरित प्रकार चाहते हैं, uint_least64_t। इन दोनों को <stdint.h>

<stdint.h> आमतौर पर int64_t परिभाषित करता है, लेकिन चूंकि मानक द्वारा इसकी आवश्यकता नहीं है, इसलिए इसे प्रत्येक कार्यान्वयन में परिभाषित नहीं किया जा सकता है। हालांकि:

  • int_least64_t - कम से कम 64 बिट्स, और
  • int_fast64_t - कम से कम 64 बिट्स

दोनों C99 और सी 11 में उपस्थित होने के लिए आवश्यक हैं के इस कार्यान्वयन में सबसे तेजी से आकार (देखें सी 99 मानक में 7.18.1.2-3, और सी 11 मानक में § 7.20.1.2-3)।


हालांकि C99 निर्दिष्ट करता है कि long longat least 64 bits on a particular machine है (§ 5.2.4.2.1), <stdint.h> में प्रकार स्पष्ट रूप से पोर्टेबल होने के लिए बनाया गया है।

आप विभिन्न प्लेटफार्मों here पर पूर्णांक आकारों के बारे में अधिक पढ़ सकते हैं। ध्यान दें कि पूर्णांक प्रकारों का आकार long डेटा प्रकार के साथ एक समस्या है - 64 बिट विंडोज़ पर, यह वर्तमान में 32 बिट्स है, जबकि 64 बिट लिनक्स पर यह 64 बिट्स है। इस कारण से, मेरा मानना ​​है कि आप <stdint.h>

के प्रकारों का उपयोग करके सबसे सुरक्षित हैं। यह ध्यान देने योग्य है कि long long अधिक पठनीय है। निजी तौर पर, मैं <stdint.h> के प्रकार पसंद करता हूं, क्योंकि वे आपको यह कहने की अनुमति देते हैं कि जब आप उनका उपयोग करते हैं तो आप क्या कहेंगे - जो मुझे अधिक पठनीय लगता है। बेशक, पठनीयता अक्सर स्वाद की बात है - और यदि आप एक मौजूदा codebase के साथ काम कर रहे हैं, मैं सिर्फ का पालन करना होगा कि वे करते हैं जो कुछ भी :)


अपने संकलक केवल C89 का समर्थन करता है, तो R..'s solution की अनुमति देगा आप पूर्णांक परिशुद्धता के 53 बिट तक।

+1

+1। –

+2

मैं असहमत हूं। वास्तव में सैद्धांतिक रूप से * अधिक * पोर्टेबल है, क्योंकि एक अनुरूप सी 99 या सी 11 कार्यान्वयन उस प्रकार को प्रदान करना चाहिए जबकि 'int64_t' आवश्यक रूप से मौजूद नहीं है। 'int64_t' का उपयोग केवल तभी किया जाना चाहिए जब आपको वास्तव में 64 बिट दो पूरक प्रकार की आवश्यकता नहीं है, इस तरह के मामलों में, जहां आपको" कम से कम 40 बिट्स "की आवश्यकता होती है, तो 'लंबा लंबा' बेहतर होता है, क्योंकि यह अनावश्यक नहीं जोड़ता है प्रतिबंध। – caf

+0

@caf: क्या सी 99 भी 'int64_t' और परिवार निर्दिष्ट नहीं करता है? (और जहां तक ​​मुझे पता है, वे अभी भी सी 11 में मौजूद हैं)। यदि आप बिल्कुल 64 बिट चौड़ाई निर्दिष्ट नहीं करना चाहते हैं, तो आप 'int_least64_t' या' int_fast64_t' का उपयोग कर सकते हैं। –

3

long longकम से कम 64 बिट्स के साथ एक पूर्णांक प्रकार है। यह सभी प्लेटफार्मों पर 40 बिट मूल्यों पर हस्ताक्षर करेगा। आप 64 बिट्स या उससे अधिक के हस्ताक्षरित मानों के लिए unsigned long long का भी उपयोग कर सकते हैं।

3

आप long long का उपयोग कर सकते हैं, जिसमें 64 बिट्स या इससे अधिक हो सकते हैं। अधिक जानकारी के लिए

http://en.cppreference.com/w/cpp/language/types

http://en.wikipedia.org/wiki/Integer_(computer_science)#Common_long_integer_sizes

Define the 64 bit width integer in Linux

+2

भी इस्तेमाल किया जा सकता है यह * कम से कम * 64-बिट लंबा है। –

+0

धन्यवाद। फिक्स्ड। इस 'लंबे समय तक' का उपयोग करने के लिए –

1

मौजूदा उत्तर अच्छे हैं, लेकिन यदि आप C89 समर्थन भी चाहते हैं, तो double सभी आईईईई 754 अनुरूप कार्यान्वयन पर बिल्कुल 40-बिट पूर्णांक स्टोर करने में सक्षम होंगे।

संबंधित मुद्दे