2013-10-14 5 views
13

क्या एक हस्ताक्षरित प्रकार के लिए मानक (या एमएसवीसी स्वामित्व) टाइपपीफ है जिसमें size_t मानों की पूरी श्रृंखला हो सकती है? अर्थात। 64-बिट सिस्टम पर, यह 128-बिट हस्ताक्षरित पूर्णांक होगा।एक हस्ताक्षरित प्रकार के लिए टाइपपीफ जिसमें size_t हो सकता है?

+0

'हस्ताक्षर किए लंबे लंबे समय तक –

+0

शीर्षक में ओपो टाइपो। मैं एक हस्ताक्षरित प्रकार के बारे में पूछ रहा था। – japreiss

+0

बंद मौके पर जिस कारण से आप एक हस्ताक्षरित प्रकार चाहते हैं उसे अधिभार/विशेष अर्थ से बचाना है, आप 'बूस्ट :: वैकल्पिक <>' रैपर पर विचार कर सकते हैं। –

उत्तर

10

सामान्य रूप से इस प्रकार को परिभाषित करना संभव नहीं है। size_t सबसे बड़ा समर्थित हस्ताक्षरित प्रकार बनाने के लिए कार्यान्वयन के लिए यह पूरी तरह से कानूनी है, जिसका अर्थ यह होगा कि कोई हस्ताक्षरित प्रकार उसके सभी मानों को रोक सकता है।

ptrdiff_t पर्याप्त रूप से पर्याप्त नहीं है। यह दो पॉइंटर्स घटाने का नतीजा है, लेकिन ऐसा कुछ भी नहीं है जो कहता है कि पॉइंटर घटाव अतिप्रवाह नहीं हो सकता है। सी ++ मानक की धारा 5.7 देखें:

जब एक ही सरणी वस्तु के तत्वों के लिए दो संकेत घटाया जाता है, परिणाम दो सरणी तत्वों की सबस्क्रिप्ट का अंतर है। परिणाम का प्रकार कार्यान्वयन-परिभाषित हस्ताक्षरित अभिन्न प्रकार है; <cstddef> हेडर (18.2) में std::ptrdiff_t के रूप में परिभाषित किया गया यह प्रकार एक ही प्रकार होगा। किसी अन्य अंकगणित अतिप्रवाह के साथ, यदि परिणाम प्रदान की गई जगह में फिट नहीं होता है, तो व्यवहार अपरिभाषित है।

सबसे बड़ा हस्ताक्षर किए प्रकार intmax_t, <stdint.h> या <cstdint> में परिभाषित किया गया है। यह एक सी 99 फीचर है, और सी ++ 11 सी 99 मानक लाइब्रेरी को शामिल करने वाला पहला सी ++ मानक था, इसलिए आपका कंपाइलर इसका समर्थन नहीं कर सकता है (और एमएसवीसी सबसे अधिक संभावना नहीं है)। यदि size_t प्रकार के सभी संभावित मानों को रखने के लिए पर्याप्त हस्ताक्षरित प्रकार है, तो intmax_t है (हालांकि एक संक्षिप्त हस्ताक्षरित प्रकार हो सकता है जो योग्यता प्राप्त करता है)।

आप long long का भी उपयोग कर सकते हैं, जो एक हस्ताक्षरित प्रकार है जो कम से कम 64 बिट्स (और सबसे अधिक संभावना intmax_t) की गारंटी है। भले ही यह size_t प्रकार के सभी संभावित मानों को पकड़ने के लिए पर्याप्त नहीं है, यह लगभग प्रासंगिक प्रकार size_t के मानों को निश्चित रूप से पकड़ लेगा - जब तक कि आपका कार्यान्वयन वास्तव में 8 एक्साबाइट्स (882 पेटबाइट्स, या 8388608 टेराबाइट्स) से अधिक वस्तुओं का समर्थन नहीं करता है।

(ध्यान दें, मैं "exa-", "peta-", और "tera-" की बाइनरी परिभाषाएँ, संदिग्ध वैधता की हैं जो उपयोग कर रहा हूँ।)

+1

* "और एमएसवीसी सबसे अधिक संभावना नहीं है" * - एक साइड नोट के रूप में नए पूर्णांक प्रकार वास्तव में कुछ सी ++ 11 सुविधाओं में से एक थे जो * एमएसवीसी * मानक पुस्तकालय * 2010 * के बाद से था। –

+0

यदि आप सुनिश्चित नहीं हैं कि आप किसी दिए गए प्लेटफॉर्म पर कौन से आकार प्राप्त करने जा रहे हैं, तो एक 'static_assert (sizeof (intmax_t)> sizeof (size_t) जोड़ें, "size_t को पकड़ने के लिए एक हस्ताक्षरित प्रकार की गारंटी नहीं मिल सकती "); 'इसलिए संकलक आपको चेतावनी देगा यदि आप संभावित रूप से परेशानी में हैं। –

2

मैं तुम्हें कुछ के लिए इस प्रकार के की जरूरत मान पॉइंटर अंकगणित की तरह। यह बहुत ही असंभव है कि आपको std::ptrdiff_t से कुछ और चाहिए। एकमात्र मामला जहां यह आधुनिक मशीन पर भूमिका निभाएगा, वह तब होता है जब आप 32-बिट मोड में होते हैं और आप 2^31 बाइट्स से अधिक डेटा सेट पर काम कर रहे हैं। (यह बिना किसी विशेष काम के विंडोज़ पर भी संभव नहीं होगा।) आप एक ही समय में उस आकार के दो सरणी का उपयोग नहीं कर पाएंगे। इस मामले में आपको शायद 64-बिट मोड में काम करना चाहिए।

64-बिट मोड में यह अगले 40 वर्षों के लिए या तो स्मृति विकास की वर्तमान गति के साथ कोई समस्या नहीं होगी। और जब यह कोई समस्या हो जाती है, तो 128-बिट मोड में अपना कोड संकलित करें और यह चलना जारी रहेगा। ;)

2

यदि आप एक मानक प्रकार चाहते हैं जिसमें सिस्टम का अधिकतम मूल्य हो, तो <cstdint> (सी ++ 11 के बाद से) मदद कर सकता है।

उस शीर्षलेख में एक टाइपपीफ है जिसमें अधिकतम चौड़ाई पूर्णांक प्रकार है, प्रकार intmax_t है। हस्ताक्षर किए गए पूर्णांक के लिए intmax_t, और हस्ताक्षर किए गए लोगों के लिए uintmax_t आर्किटेक्चर द्वारा पूरी तरह से समर्थित सबसे बड़ा पूर्णांक हैं।

std::cout << "intmax_t is same int64_t? " 
      << (std::is_same<intmax_t, int64_t>::value ? "Yes" : "No"); 

विल उत्पादन:

intmax_t ही int64_t है

तो चलिए आप निम्नलिखित अनुदेश एक 64 बिट वास्तुकला में हैं लगता है? हां

Live demo

उम्मीद है कि यह मदद करता है।

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