क्या एक हस्ताक्षरित प्रकार के लिए मानक (या एमएसवीसी स्वामित्व) टाइपपीफ है जिसमें size_t
मानों की पूरी श्रृंखला हो सकती है? अर्थात। 64-बिट सिस्टम पर, यह 128-बिट हस्ताक्षरित पूर्णांक होगा।एक हस्ताक्षरित प्रकार के लिए टाइपपीफ जिसमें size_t हो सकता है?
उत्तर
सामान्य रूप से इस प्रकार को परिभाषित करना संभव नहीं है। 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-" की बाइनरी परिभाषाएँ, संदिग्ध वैधता की हैं जो उपयोग कर रहा हूँ।)
* "और एमएसवीसी सबसे अधिक संभावना नहीं है" * - एक साइड नोट के रूप में नए पूर्णांक प्रकार वास्तव में कुछ सी ++ 11 सुविधाओं में से एक थे जो * एमएसवीसी * मानक पुस्तकालय * 2010 * के बाद से था। –
यदि आप सुनिश्चित नहीं हैं कि आप किसी दिए गए प्लेटफॉर्म पर कौन से आकार प्राप्त करने जा रहे हैं, तो एक 'static_assert (sizeof (intmax_t)> sizeof (size_t) जोड़ें, "size_t को पकड़ने के लिए एक हस्ताक्षरित प्रकार की गारंटी नहीं मिल सकती "); 'इसलिए संकलक आपको चेतावनी देगा यदि आप संभावित रूप से परेशानी में हैं। –
मैं तुम्हें कुछ के लिए इस प्रकार के की जरूरत मान पॉइंटर अंकगणित की तरह। यह बहुत ही असंभव है कि आपको std::ptrdiff_t
से कुछ और चाहिए। एकमात्र मामला जहां यह आधुनिक मशीन पर भूमिका निभाएगा, वह तब होता है जब आप 32-बिट मोड में होते हैं और आप 2^31 बाइट्स से अधिक डेटा सेट पर काम कर रहे हैं। (यह बिना किसी विशेष काम के विंडोज़ पर भी संभव नहीं होगा।) आप एक ही समय में उस आकार के दो सरणी का उपयोग नहीं कर पाएंगे। इस मामले में आपको शायद 64-बिट मोड में काम करना चाहिए।
64-बिट मोड में यह अगले 40 वर्षों के लिए या तो स्मृति विकास की वर्तमान गति के साथ कोई समस्या नहीं होगी। और जब यह कोई समस्या हो जाती है, तो 128-बिट मोड में अपना कोड संकलित करें और यह चलना जारी रहेगा। ;)
यदि आप एक मानक प्रकार चाहते हैं जिसमें सिस्टम का अधिकतम मूल्य हो, तो <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 बिट वास्तुकला में हैं लगता है? हां
उम्मीद है कि यह मदद करता है।
- 1. टाइपपीफ प्रकार
- 2. मैं एक हस्ताक्षरित पूर्णांक प्रकार के लिए उपयोगकर्ता द्वारा परिभाषित शाब्दिक कैसे बना सकता हूं?
- 3. टाइपपीफ और अधूरा प्रकार
- 4. टाइपपीफ प्रकार की जांच?
- 5. किस प्रकार का डेटा size_t होल्डिंग है?
- 6. एक हस्ताक्षरित प्रकार के लिए हस्ताक्षरित शाब्दिक असाइन करते समय जीसीसी चेतावनी क्यों नहीं देता है?
- 7. size_t
- 8. कैसे पोर्टेबल एक हस्ताक्षरित प्रकार के लिए -1 कास्टिंग कर रहा है?
- 9. प्रदर्शन: आदिम प्रकार के लिए टाइपपीफ बनाम रैपर वर्ग?
- 10. एक प्रकार एक संदर्भ प्रकार और एक मूल्य प्रकार एक ही समय में हो सकता है?
- 11. समारोह, लेकिन होने प्रकार [हो सकता है कि एक] -> हो सकता है कि [एक]
- 12. फ़ंक्शन पॉइंटर के टाइपपीफ को परिभाषित करने के लिए कैसे करें जिसमें टेम्पलेट तर्क
- 13. आकार_टी हमेशा हस्ताक्षरित है?
- 14. टाइपपीफ
- 15. ptrdiff_t के हस्ताक्षरित समकक्ष क्या है?
- 16. एक हो सकता है कि से एक वापसी पर आपरेटिंग, जिसमें "बस"
- 17. मार्शल SIZE_T * के लिए सही तरीका?
- 18. मेरे पास एक WPF टेक्स्टब्लॉक कैसे हो सकता है जिसमें सभी फ़ॉन्ट वजन के लिए समान आकार हो?
- 19. क्या होता है यदि एक enum एक अभिन्न प्रकार में फिट नहीं हो सकता है?
- 20. टाइपपीफ बनाम स्ट्रक्चर/यूनियन/एनम के पीछे तर्क क्या है, क्या केवल एक नामस्थान नहीं हो सकता है?
- 21. बीएसओडी के लिए एक साधारण कार्यक्रम जिम्मेदार हो सकता है?
- 22. एक [[noreturn]] फ़ंक्शन का रिटर्न प्रकार कैसे हो सकता है?
- 23. क्या uint8_t गैर-वर्ण प्रकार हो सकता है?
- 24. एक फ्लोट द्वारा गुणा किए जाने पर एक हस्ताक्षरित लंबे समय तक ऋणात्मक हो सकता है?
- 25. पायथन - एक वस्तु अपना प्रकार का हो सकता है?
- 26. एक बीन संपत्ति का प्रकार कैसे शून्य हो सकता है?
- 27. FFI: कैसे घोषित करने के लिए `size_t`
- 28. क्या पर्ल में एक सहयोगी सरणी प्रकार है जिसमें किसी भी प्रकार की चाबी हो सकती है?
- 29. टाइपपीफ और गैर-साधारण प्रकार विनिर्देश
- 30. टाइपपीफ
'हस्ताक्षर किए लंबे लंबे समय तक –
शीर्षक में ओपो टाइपो। मैं एक हस्ताक्षरित प्रकार के बारे में पूछ रहा था। – japreiss
बंद मौके पर जिस कारण से आप एक हस्ताक्षरित प्रकार चाहते हैं उसे अधिभार/विशेष अर्थ से बचाना है, आप 'बूस्ट :: वैकल्पिक <>' रैपर पर विचार कर सकते हैं। –