c ++中最大的整数数据类型?

时间:2009-09-13 07:41:58

标签: c++

c ++中最大的整数数据类型是什么?

8 个答案:

答案 0 :(得分:21)

最大的标准 C ++整数类型为long

C有long long,C ++ 0x也会添加它,当然你可以实现自己的自定义整数类型,甚至可能是BigInt类。

但从技术上讲,考虑到内置的整数类型,long就是你的答案。

答案 1 :(得分:9)

long long数据类型是标准C99和C ++ 0x中最大的内置整数数据类型。与所有其他整数数据类型一样,long long没有给出精确的字节大小。相反,它被定义为至少 64位整数。虽然long long不是官方C ++标准的一部分,但它在现代编译器中得到了普遍支持。但请注意,现代桌面的许多编译器都将longlong long定义为64位,而嵌入式处理器的许多编译器将long定义为32位和{{1}作为64位(显然有少数例外)。

如果您需要更高的精度或绝对不能使用long long语言扩展,那么您将不得不使用一个旨在处理极大或极小数字的C或C ++库。

答案 2 :(得分:7)

您可能希望通过<cstdint>及其typedef intmax_tuintmax_t映射到编译体系结构中的最大(完全实现)类型来避免担心原始名称。

我很惊讶没有人说过这个,但粗略的研究表明它是在C ++ 11中添加的,这可能解释了之前提到的缺乏。 (虽然它的新原语/内置类型long long 引用了!)

某些编译器也可能提供更大的类型,但这些类型可能带有警告,例如:Why in g++ std::intmax_t is not a __int128_t?

就个人而言,我正在使用cstdint,因为它更容易快速查看我使用的最小字节数 - 而不是必须记住给定基元对应的位数 - 标准意味着它避免了我的类型是平台依赖的。另外,就我所做的而言,uint8_t比无尽的unsigned char更快更整洁!

修改:事后看来,我想澄清一下:uint8_t不能保证等同于unsigned char。当然,它在我的机器上,它也可能适合你。但标准并不要求这种等同性;请参阅:When is uint8_t ≠ unsigned char?因此,现在当我需要标准定义的[[un]signed] char特殊能力时,我只使用它。

答案 3 :(得分:4)

在编译器的xmmintrin.h中定义了128位打包整数和浮点格式,支持SSE以使能SSE寄存器和指令。它们当然不是C ++标准的一部分,但由于它们得到MSVC,GCC和英特尔C ++编译器的支持,因此有一定程度的跨平台支持(至少OS X,Linux和Windows用于Intel CPU)。其他ISA具有SIMD扩展,因此可能存在支持128或256位SIMD指令的其他平台/编译器特定扩展。英特尔即将推出的AVX指令集将具有256位寄存器,因此我们应该看到一组新的数据类型和内在函数。

它们的行为与内置数据类型不同(即,您必须使用内部函数而不是运算符来操作它们,并且它们与SIMD操作一起工作)但是因为它们实际上映射到128位寄存器在硬件上他们值得一提。

Details about Streaming SIMD Extension (SSE)Intrinsics

答案 4 :(得分:3)

boost::multiprecision::cpp_int是一个任意精度整数类型。所以C ++中没有“最大整数数据类型”。只是一个最大的内置整数类型,AFAIK在标准C ++中是long

答案 5 :(得分:2)

您可以通过定义自己的类轻松获得更大的数据类型。 您可以从Java中的 BigInteger 类中获得灵感。这是一个很好的,但它不一定是一个实际的整数,即使它完全像一个整数。

答案 6 :(得分:0)

在Borland和Microsoft编译器中,__ int64可能是你能获得的最大值。

答案 7 :(得分:0)

__int128_t和__uint128_t(无符号__int128_t)数据类型是128位长,是长long的两倍(对于c ++新手来说,长度为64位)。但是,如果您要使用它们,那么您需要进行一些重载,因为int128数据类型不太受支持(至少在Mingw中)。这是一个如何使用它来显示2 ^ x-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数据类型的问题在于并非所有编译器都支持它。