【问题标题】:biggest integer datatype in c++?c++中最大的整数数据类型?
【发布时间】:2010-11-27 21:01:24
【问题描述】:

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

【问题讨论】:

    标签: c++


    【解决方案1】:

    __int128_t 和 __uint128_t (unsigned __int128_t) 数据类型的长度为 128 位,是 long 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 数据类型的问题在于并非所有编译器都支持它。

    【讨论】:

      【解决方案2】:

      您可能更愿意通过&lt;cstdint&gt; 及其类型定义intmax_tuintmax_t 映射到编译架构上最大的(完全实现的)类型来避免担心原始名称。

      我很惊讶没有其他人这么说,但粗略的研究表明它是在 C++11 中添加的,这可能可以解释之前没有提及的原因。 (虽然它的同伴新的原始/内置类型long long 引用了!)

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

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

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

      【讨论】:

      • downvoter:您是否有真正的问题可以告诉我们其他人,或者您只是对不相关的事情感到痛苦?
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        如果您需要更高的精度或绝对不能使用 long long 语言扩展,您将不得不使用专为处理极大或极小数字而设计的 C 或 C++ 库之一。

        【讨论】:

        • "...只要 long long 和 long 在大多数现代桌面 CPU 上都是 64 位。"不对。取决于编译器。在 LLP64 模型(VC 使用)中,long 保持为 32 位,long long 为 64 位。
        • 仅供参考,long long 不在 C++ 标准中。它在 C99 中添加到 C 中。目前,它是大多数编译器都支持的无处不在的扩展。
        • long long 是 C++0x 的一部分(或者我应该说 C++1x,现在?),请参阅 research.att.com/~bs/C++0xFAQ.html#long-long
        • Pax, 定义宏 INT_MAX 等。该标准为这些定义了最小值,有效地建立了表示内置整数类型所需的最小位数。 int 为 16,long 为 32,long 为 64(新标准)。
        • 标准中的什么地方说long long存在它甚至在 C++ 中都不存在。它是一个 C 数据类型,是的,它将在 C++0x 中添加,但目前,它在 C++ 中不存在。 -1
        【解决方案5】:

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

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

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

        【讨论】:

        • 从技术上讲,下一个 C++ 标准可能没有 long long 类型。即使在这个后期阶段,也没有什么是不能从标准中拉出来的。但是 +1 是一个(正确的)学究 :-)
        • 而你称为学究。 ;) 但是,是的,公平点。目前,它看起来会被包含在 C++0x 中,但谁知道呢。 :)
        • 现在我们知道了——long long 在 C++11 中。
        【解决方案6】:

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

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

        Details about Streaming SIMD Extension (SSE)Intrinsics

        【讨论】:

          【解决方案7】:

          您可以通过定义自己的类轻松获得更大的数据类型。 您可以从 Java 中的 BigInteger 类中获得灵感。这是一个不错的整数,但它不一定是一个实际的整数,即使它的行为与整数一模一样。

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-10-28
              • 1970-01-01
              • 2016-03-03
              • 2019-01-02
              • 2011-01-04
              • 2017-01-28
              • 2023-04-02
              相关资源
              最近更新 更多