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

lf5gs5x2  于 2022-12-24  发布在  其他
关注(0)|答案(9)|浏览(1844)

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

92dk7w1h

92dk7w1h1#

最大的标准C整数类型是long
C有一个long long,C
0x也会添加它,当然你可以实现你自己的自定义整数类型,甚至可能是一个BigInt类。
但从技术上讲,考虑到内置的整数类型,long是您的答案。

kyvafyod

kyvafyod2#

long long数据类型是标准C99和C0x中最大的内置整型数据类型。就像所有其他整型数据类型一样,long long没有给出确切的字节大小。相反,它被定义为至少一个64位整数。虽然long long不是官方C标准的一部分,然而,注意,许多用于现代桌面的编译器将longlong long都定义为精确的64位,而用于嵌入式处理器的许多编译器将long定义为32位,将long long定义为64位(显然有少数例外)。
如果您需要更高的精度,或者绝对不能使用long long扩展,则必须使用C或C++库中的一个,这些库设计用于处理非常大或非常小的数字。

6za6bjd0

6za6bjd03#

您可能更愿意通过<cstdint>及其typedefx 1 m1n1x和uintmax_tMap到编译体系结构上最大的(完全实现的)类型,从而避免担心原语名称。
我很惊讶没有其他人这样说,但是粗略的研究表明它是在C++11中添加的,这可能可以解释为什么以前没有提到它(尽管它的新原语/内置类型long long * 被 * 引用了!)
一些编译器也可能提供更大的类型,尽管这些类型可能带有 * 警告 *,例如:Why in g++ std::intmax_t is not a __int128_t?
就我个人而言,我使用cstdint是因为它更容易快速查看我使用的最小字节数-而不是必须记住给定原语对应的位数-并且标准意味着它避免了我的类型依赖于平台。另外,对于我所做的,uint8_t比无尽的unsigned char更快更整洁!

edit:事后看来,我想澄清一下:uint8_t并不保证等价于unsigned char。当然,在我的机器上是这样的,并且可能对您也是这样。但是标准并不要求这种等价性;参见:When is uint8_t ≠ unsigned char?由于这个原因,现在当我需要[[un]signed] char的标准定义的特殊能力时,我只使用它。

qxsslcnc

qxsslcnc4#

在支持SSE的编译器上,xmmintrin. h中定义了128位压缩整数与浮点格式,以便能够使用SSE寄存器与指令。当然,它们不是C标准的一部分,但由于MSVC、GCC与“英特尔C编译器”都支持它们,因此在一定程度上提供了跨平台支持(至少OS X、Linux和Windows用于Intel CPU)。其它ISA具有SIMD扩展,因此可能存在其它平台/编译器特定的扩展,其支持128或256位SIMD指令。Intel即将到来的AVX指令集将具有256位寄存器,因此我们应该看到一组新的数据类型和intrinsic。
它们的行为不太像内置数据类型(即,必须使用内部函数而不是运算符来操作它们,而且它们使用SIMD操作),但由于它们实际上Map到硬件上的128位寄存器,因此值得一提。
Details about Streaming SIMD Extension (SSE)Intrinsics

6ovsh4lw

6ovsh4lw5#

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

wyyhbhjk

wyyhbhjk6#

通过定义自己的类,你可以很容易地得到更大的数据类型。你可以从Java中的类BigInteger得到启发。它是一个很好的类,但它不一定是一个真正的整数,即使它的行为完全像整数。

oprakyz7

oprakyz77#

在Borland和Microsoft编译器中,__int64可能是您能得到的最大值。

pkwftd7m

pkwftd7m8#

__int128_t和__uint128_t(unsigned __int128_t)数据类型的长度为128位,是long long的两倍(对于c++新手来说,它的长度是64位)然而,如果你打算使用它们,那么你需要做一些重载,因为int 128数据类型没有得到太多的支持(至少在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
}

int 128数据类型的问题在于并非所有编译器都支持它。

5rgfhyps

5rgfhyps9#

Repl.it 说unsigned long long int实际上是一个有效的类型,我发现这很有趣。

相关问题