2009-09-13 15 views

उत्तर

0

बोर्लेन्ड और माइक्रोसॉफ्ट compilers में, __int64 शायद सबसे बड़ा तुम मिल सकता है।

9

long long डेटा-प्रकार मानक सी 99 और सी ++ 0x में सबसे बड़ा अंतर्निहित अभिन्न डेटाटाइप है। जैसे कि अन्य सभी अभिन्न डेटा प्रकारों के साथ, long long बाइट्स में सटीक आकार नहीं दिया जाता है। इसके बजाए, इसे कम से कम एक 64-बिट पूर्णांक माना जाता है। जबकि long long आधिकारिक सी ++ मानक का हिस्सा नहीं है, यह सर्वव्यापी आधुनिक कंपाइलरों में समर्थित है। नोट, हालांकि, आधुनिक डेस्कटॉप के लिए कई कंपाइलर्स long और long long को बिल्कुल 64-बिट्स के रूप में परिभाषित करते हैं, जबकि एम्बेडेड प्रोसेसर के लिए कई कंपाइलर 0 -को 32-बिट्स और long long के रूप में 64-बिट्स (स्पष्ट रूप से कुछ अपवाद) के रूप में परिभाषित करते हैं।

यदि आपको अधिक सटीकता की आवश्यकता है या बिल्कुल long long भाषा एक्सटेंशन का उपयोग नहीं कर सकते हैं, तो आपको सी या सी ++ पुस्तकालयों में से एक का उपयोग करना होगा जो अत्यधिक बड़ी या छोटी संख्याओं के साथ काम करने के लिए डिज़ाइन किए गए हैं।

+3

"... लंबे समय तक लंबे और लंबे समय तक दोनों आधुनिक डेस्कटॉप सीपीयू पर 64-बिट होंगे।" सच नहीं। कंपाइलर पर निर्भर करता है। एलएलपी 64 मॉडल (जिसे वीसी द्वारा उपयोग किया जाता है) में, 'लम्बा' 32-बिट और 'लंबा लंबा' 64-बिट रहता है। –

+1

संभावित 64 बिट मेमोरी मॉडल के लिए यह लिंक http://en.wikipedia.org/wiki/LLP64#Specific_data_models देखें। –

+10

एफवाईआई, 'लंबे समय तक' सी ++ मानक में नहीं है। इसे सी 99 में सी में जोड़ा गया है। वर्तमान में, यह अधिकांश कंप्यूटर्स द्वारा समर्थित एक सर्वव्यापी एक्सटेंशन है। –

2

आप अपनी कक्षा को परिभाषित करके आसानी से बड़ा डेटाटाइप प्राप्त कर सकते हैं। आप जावा में बिगइंटर से प्रेरित हो सकते हैं। यह एक अच्छा है लेकिन यह एक वास्तविक पूर्णांक नहीं है, भले ही यह बिल्कुल एक जैसा कार्य करता हो।

4

128 बिट पैक पूर्णांक और चल बिन्दु compilers कि SSE समर्थन SSE रजिस्टरों और निर्देश के उपयोग को सक्षम करने पर xmmintrin.h में परिभाषित स्वरूपों रहे हैं। वे पाठ्यक्रम के सी ++ मानक का हिस्सा नहीं हैं, लेकिन चूंकि वे एमएसवीसी, जीसीसी और इंटेल सी ++ कंपाइलर द्वारा समर्थित हैं, वहां क्रॉस-प्लेटफ़ॉर्म समर्थन की एक डिग्री है (कम से कम ओएस एक्स, लिनक्स और विंडोज इंटेल सीपीयू के लिए विंडोज)। अन्य आईएसए में सिम एक्सटेंशन हैं इसलिए शायद अन्य प्लेटफ़ॉर्म/कंपाइलर विशिष्ट एक्सटेंशन हैं जो 128 या 256 बिट सिम निर्देशों का समर्थन करते हैं। इंटेल के आने वाले एवीएक्स निर्देश सेट में 256 बिट रजिस्ट्रार होंगे, इसलिए हमें इसके लिए डेटा प्रकारों और इंट्रिनिक्स का एक नया सेट देखना चाहिए।

वे अंतर्निहित डेटा प्रकारों की तरह व्यवहार नहीं करते हैं (यानी, आपको ऑपरेटरों के बजाय आंतरिक कार्यों का उपयोग करना होगा, और वे सिमड ऑपरेशंस के साथ काम करते हैं) लेकिन चूंकि वे वास्तव में 128-बिट पर मानचित्र करते हैं हार्डवेयर पर पंजीकृत वे उल्लेखनीय लायक हैं।

Details about Streaming SIMD Extension (SSE)Intrinsics

21

सबसे बड़ी मानक सी ++ पूर्णांक प्रकार long है।

सी में long long है, और सी ++ 0x भी इसे जोड़ने जा रहा है, और निश्चित रूप से आप अपने स्वयं के कस्टम पूर्णांक प्रकार को लागू कर सकते हैं, शायद यहां तक ​​कि एक बिगइन्ट क्लास भी।

लेकिन तकनीकी तौर पर, निर्मित पूर्णांक प्रकार पर विचार, long अपने जवाब है।

+1

तकनीकी रूप से, अगले सी ++ मानक में लंबे समय तक नहीं हो सकता है। इस देर के चरण में भी कुछ भी नहीं है जिसे मानक से खींचा जा सकता है। लेकिन एक (सही) पेडेंट होने के लिए +1 :-) – paxdiablo

+3

और आपने * मुझे * एक पेडेंट कहा। ;) लेकिन हाँ, उचित बिंदु। फिलहाल, ऐसा लगता है कि यह सी ++ 0x में शामिल होने जा रहा है, लेकिन कौन जानता है। :) – jalf

+8

अब हम जानते हैं- 'लंबा लंबा' सी ++ 11 में है। –

7

आप सबसे बड़ा करने के लिए मानचित्रण द्वारा आदिम नाम के बारे में चिंता से बचने के लिए पसंद कर सकते हैं (पूरी तरह से महसूस किया) संकलन वास्तुकला पर टाइप <cstdint> और उसके typedefs intmax_t और uintmax_t के माध्यम से।

मैं कोई और हैरान था यह कहा है, लेकिन सरसरी अनुसंधान इंगित करता है यह सी ++ 11 है, जो शायद कमी की व्याख्या कर सकते पिछले उल्लेख है की में जोड़ा गया है। (हालांकि इसके साथी नए आदिम/अंतर्निर्मित प्रकार long long उद्धृत थे!)

कुछ compilers भी बड़ा प्रकार प्रदान कर सकता है, हालांकि इन उदाहरण के लिए, चेतावनियां के साथ आ सकता है: Why in g++ std::intmax_t is not a __int128_t?

व्यक्तिगत रूप से, मैं cstdint उपयोग कर रहा हूँ के रूप में यह आसान है जल्दी से देखने के लिए कितने बाइट्स न्यूनतम मैं उपयोग करने के बजाए - यह याद रखने के बजाए कि दिए गए आदिम कितने बिट्स से मेल खाते हैं - और मानक का मतलब है कि यह मेरे प्रकार प्लेटफॉर्म-निर्भर होने से बचाता है। इसके अलावा, मैं जो करता हूं, uint8_t अंतहीन unsigned char एस की तुलना में तेज़ और साफ है!

संपादित: uint8_tunsigned char के बराबर होने का इसकी गारंटी नहीं है: मसा में, मैं स्पष्ट करना चाहता हूँ। निश्चित रूप से, यह मेरी मशीनों पर है, और यह शायद आपके लिए भी है। लेकिन मानक द्वारा इस समकक्ष की आवश्यकता नहीं है; देखें: When is uint8_t ≠ unsigned char? इसी कारण से, अब जब मुझे [[un]signed] char की मानक परिभाषित विशेष क्षमताओं की आवश्यकता है, तो मैं केवल यही उपयोग करता हूं।

+0

डाउनवॉटर: क्या कोई वास्तविक समस्या है जिसके बारे में आप बाकी के बारे में बता सकते हैं, या क्या आप कुछ असंबंधित के बारे में कड़वाहट महसूस कर रहे हैं? –

3

boost::multiprecision::cpp_int एक मनमाना सटीक पूर्णांक प्रकार है। तो सी ++ में कोई "सबसे बड़ा पूर्णांक डेटाटाइप" नहीं है। बस एक सबसे बड़ा निर्मित अभिन्न प्रकार, जो मानक सी ++ में AFAIK long है।

0

__int128_t और __uint128_t (हस्ताक्षरित __int128_t) डेटा प्रकार 128 बिट लंबा हैं, लंबे समय के आकार को दोगुना करें (जो 64 बिट्स सी ++ के लिए नए हैं)। हालांकि, यदि आप उनका उपयोग करने जा रहे हैं, तो आपको कुछ ओवरलोडिंग करने की आवश्यकता है क्योंकि int128 डेटा प्रकार बहुत गहराई से समर्थित नहीं है (कम से कम मिंगव में)। इस तरह आप उपयोग कर सकते हैं का एक उदाहरण दिखाने के लिए 2^एक्स 1 2 तक^128-1

#include <iostream> 

char base10_lookup_table[10]={'0','1','2','3','4','5','6','7','8','9'}; 

std::ostream& 
operator<<(std::ostream& dest, __int128 value) 
{ 
    std::ostream::sentry s(dest); 
    if (s) { 
     __uint128_t tmp = value < 0 ? -value : value; 
     char buffer[ 128 ]; 
     char* d = std::end(buffer); 
     do 
     { 
      -- d; 
      *d = base10_lookup_table[ tmp % 10 ]; 
      tmp /= 10; 
     } while (tmp != 0); 
     if (value < 0) { 
      -- d; 
      *d = '-'; 
     } 
     int len = std::end(buffer) - d; 
     if (dest.rdbuf()->sputn(d, len) != len) { 
      dest.setstate(std::ios_base::badbit); 
     } 
    } 
    return dest; 
} 

std::ostream& 
operator<<(std::ostream& dest, unsigned __int128 value) 
{ 
    std::ostream::sentry s(dest); 
    if (s) { 
     __uint128_t tmp = value < 0 ? -value : value; 
     char buffer[ 128 ]; 
     char* d = std::end(buffer); 
     do 
     { 
      -- d; 
      *d = base10_lookup_table[ tmp % 10 ]; 
      tmp /= 10; 
     } while (tmp != 0); 
     if (value < 0) { 
      -- d; 
      *d = '-'; 
     } 
     int len = std::end(buffer) - d; 
     if (dest.rdbuf()->sputn(d, len) != len) { 
      dest.setstate(std::ios_base::badbit); 
     } 
    } 
    return dest; 
} 



int main (void) 
{ 
    __uint128_t big_value = 0;  //unsigned int128 

    for (unsigned char i=0; i!=129; ++i) //I am using an unsigned char because it can hold all the values that will be used 
    { 
     std::cout << "1 less than 2 to the power of " << int(i) << " = \0" << big_value << "\n"; 
     big_value |= (__uint128_t)1 << i; 
    } 

    return 0; //formal way of exiting 
} 

int128 डेटाप्रकार के साथ समस्या यह है कि नहीं सभी compilers यह समर्थन कर सकते हैं है।

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