23 Stimmen

größter Integer-Datentyp in C++?

Welches ist der größte Integer-Datentyp in C++?

2voto

Omar Al-Ithawi Punkte 4630

Sie können leicht größere Datentypen erhalten, indem Sie Ihre eigene Klasse definieren. Inspirieren lassen können Sie sich von der Klasse BigInteger in Java. Es ist eine nette Sache, aber es ist nicht unbedingt eine echte Ganzzahl, auch wenn sie sich genau wie eine verhält.

0voto

David Andres Punkte 30563

In den Borland- und Microsoft-Compilern ist __int64 wahrscheinlich der größte Wert, den man bekommen kann.

0voto

Jack G Punkte 3797

Die Datentypen __int128_t und __uint128_t (unsigned __int128_t) sind 128 Bits lang, also doppelt so lang wie ein long long (was 64 Bits lang ist, für diejenigen, die neu in C++ sind). Wenn Sie diese Datentypen verwenden möchten, müssen Sie jedoch einige Überladungen vornehmen, da der Datentyp int128 (zumindest in Mingw) nicht allzu stark unterstützt wird. Dies ist ein Beispiel, wie man damit 2^x-1 bis 2^128-1 darstellen kann

#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
}

Das Problem mit dem Datentyp int128 ist, dass er nicht von allen Compilern unterstützt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X