2012-05-17 14 views
5

मैं अपने प्रोजेक्ट में बड़े पॉजिटिव इंटीग्रर्स (8 बाइट्स) का उपयोग करने में सक्षम होना चाहता हूं, भले ही आकार (अप्रमाणित लम्बाई) मेरे सिस्टम में 8 उत्पन्न करता है, मैंने पढ़ा लंबे समय तक हस्ताक्षरित अधिकांश सिस्टम केवल 4 बाइट हैं और मैंने कम से कम 8 बाइट होने की गारंटी दी है, इसलिए मैंने लंबे समय तक बिना हस्ताक्षर किए जाने का फैसला किया है।बिना हस्ताक्षर किए लंबे लंबे बनाम अप्रमाणित लंबे (पोर्टेबिलिटी पॉइंट ऑफ व्यू)

जितना अधिक मैं इसका उपयोग करता हूं, मैंने देखा कि यह सुपर पोर्टेबल भी नहीं है, उदाहरण के लिए कुछ सिस्टम (कंपाइलर के आधार पर) printf प्रारूप में% llu के साथ स्वरूपित करता है, कुछ में यह% lld के साथ स्वरूपित करता है।

मेरा कोड केवल 64 बिट डेबियन मशीनों में चलाया जाएगा, जिसमें बिना हस्ताक्षर किए गए लंबे 8 बाइट होंगे। पोर्टेबिलिटी एक बड़ा मुद्दा नहीं है। क्या यह इन परिस्थितियों में लंबे समय तक हस्ताक्षरित लंबे समय तक हस्ताक्षरित लंबे समय तक उपयोग करने के लिए एक ओवरकिल है, क्या बिना हस्ताक्षर किए लंबे लंबे समय तक हस्ताक्षरित लंबे समय तक उपयोग करने का कोई अन्य लाभ है?

+7

क्या आपने 'uint64_t' की कोशिश की है? यह ' में है। – Mysticial

+0

बिना हस्ताक्षर किए लंबे समय तक इसका उपयोग करने का क्या फायदा है? –

+1

यदि आपके पास 64 बिट्स के साथ कोई प्रकार नहीं है, तो लंबे समय तक लंबे समय तक यह संकलन बंद कर देता है। दोनों सी ++ 11 में मौजूद हैं, दोनों अक्सर पहले एक्सटेंशन के रूप में मौजूद होते हैं, लेकिन अगर कोई कभी कभी मौजूद होता है और दूसरा नहीं होता तो मुझे आश्चर्य नहीं होगा।यदि आपके पास यह नहीं है, तो लंबे समय से stdint.h अनुकरण करना आसान है (मान लेना आसान है)। – AProgrammer

उत्तर

9

unsigned long long प्लेटफॉर्म पर ध्यान दिए बिना कम से कम 64 बिट्स होने की गारंटी है। (ऐसे प्लेटफ़ॉर्म हैं जहां यह अधिक — है, मुझे 72 बिट्स और 96 बिट्स — पता है लेकिन वे दुर्लभ हैं, और निश्चित रूप से विदेशी हैं।) unsigned long कम से कम 32 बिट होने की गारंटी है। यदि आपको 32 से अधिक बिट्स की आवश्यकता है, तो मैं unsigned long long की अनुशंसा करता हूं।

स्वरूपण के संबंध में, printf के साथ, आपको "%llu" (क्योंकि यह हस्ताक्षरित है) का उपयोग करना चाहिए; "%lld"signed long long के लिए है।

+0

धन्यवाद जेम्स, मैंने यही सोचा, यह निश्चित रूप से लंबे समय तक हस्ताक्षर किए जाने के लिए सुरक्षित है। हालांकि सवाल यह है कि, चूंकि मेरे विकास और लक्ष्य वातावरण में हस्ताक्षर किए गए लंबे समय तक 8 बाइट्स हैं, क्या मैं इसके बजाय बिना हस्ताक्षरित लंबे समय तक उपयोग कर सकता हूं? जिस तरह से संकलक एक चेतावनी फेंकता है जब मैं एक लंबे समय तक एक लंबे समय तक% llu का उपयोग करता हूं, इस प्रकार की गैर-पोर्टेबिलिटी मुझे बिना लंबे समय तक हस्ताक्षर किए जाने से दूर डरा रही हैं। –

+0

क्या सी ++ 11 के बाद से "कम से कम 64 बिट्स" गारंटी उपलब्ध नहीं है? – juanchopanza

+0

@erinc यदि आप ऐसे मंच पर काम कर रहे हैं जहां 'लंबे समय तक' और 'लंबे' दोनों का आकार समान है, तो जेनरेट कोड उनके लिए समान होना चाहिए, इसलिए 'लंबे समय तक' उपयोग करने का कोई कारण नहीं है। और यदि संकलक चेतावनी देता है कि '' llu "' 'unsigned long long' को पास करते समय, इसे केवल एक बग माना जा सकता है। '% Llu' 'को पास करने का एकमात्र कानूनी प्रकार' लंबे समय तक हस्ताक्षरित 'है; किसी अन्य प्रकार से गुजरना अपरिभाषित व्यवहार है। –

0

यदि आपको यह सुनिश्चित करने की ज़रूरत है कि आपके पास प्लेटफ़ॉर्म से स्वतंत्र पूर्णांक मान का एक निश्चित आकार है, तो आप boost :: integers लाइब्रेरी का उपयोग कर सकते हैं (here देखें)। आप बिना हस्ताक्षर किए गए मानों के लिए boost :: int64_t या boost :: uint64_t का उपयोग कर सकते हैं

+0

क्यों बूस्ट का उपयोग करें और stdint.h uint64_t नहीं? – WeaselFox

0

आप यह कर सकते हैं आप लंबे और लंबे साथ रहना चाहते हैं:

#include <limits.h> 
#if ULONG_MAX >= 0xFFFFFFFFFFFFFFFFULL 
typedef unsigned long uint64; 
#else 
typedef unsigned long long uint64; 
#endif 

W.r.t. इस

कुछ सिस्टम (संकलक के आधार पर) printf यह प्रारूपों% LLU साथ में

, कुछ में यह% lld

printf() साथ यह प्रारूप प्रारूप लगता है कि नहीं है। आप इसे प्रारूप बताओ।

आप एक uint64 ऊपर में के रूप में परिभाषित printf चाहते हैं, इसे इस तरह कार्य करें:

printf("%llu", (unsigned long long)some_uint64_value);

आप typedef unsigned long long ulonglong; डाली टाइप करने के लिए आसान बनाने के लिए कर सकते हैं।

ऐसा करने के अन्य तरीके मौजूद हैं, लेकिन सभी कंपाइलर्स उनका समर्थन नहीं करते हैं। इस कारण मैंने संख्या में ULL प्रत्यय संलग्न किया। C89 और C99 के बीच कुछ संगतता मोड में, 0xFFFFFFFFFFFFFFFF को unsigned long के रूप में व्याख्या किया जा सकता है, unsigned long long नहीं, और छोटा कर दिया जाएगा। डिफ़ॉल्ट रूप से नवीनतम जीसीसी सी कोड के लिए gnu89 मोड में चलाता है, c99 या उच्चतर नहीं।

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