Welches ist der größte Integer-Datentyp in C++?
Antworten
Zu viele Anzeigen?
Omar Al-Ithawi
Punkte
4630
David Andres
Punkte
30563
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.
- See previous answers
- Weitere Antworten anzeigen