【问题标题】:Are there types bigger than long long int in C++?C++ 中是否存在比 long long int 更大的类型?
【发布时间】:2011-03-21 18:22:35
【问题描述】:

C++ 中有比 long long int 更大的类型吗?

我的编译器是 g++。

【问题讨论】:

  • 你在说什么类型?整数类型或任何类型?在这种情况下,什么是“更大”:范围还是大小?无论如何,int[100] 类型很可能比long long 大很多,但我认为这不是您要问的。澄清你的问题。在这个时候它没有什么意义。
  • 你可以试试 long long long(我只是在开玩笑)我相信 long long 是所有架构中最大的 64 位
  • @Jesus Ramos:至少有 64 位(可能更大)。 @AndreyT:不是正式的,但它是一个几乎无处不在的扩展,我们也希望在下一版本的标准中看到它(使我们与 C 保持一致)。
  • 问题是 sizeof(long long) 有一个松散的定义是 sizeof(long)
  • 当评论在技术上正确但过于挑剔时,我该点击哪里...@AndreyT 说真的,你不明白他的意思吗?

标签: c++ types


【解决方案1】:

【讨论】:

【解决方案2】:

不,但您可以使用像 GMP 这样的库来处理更大的数字。

【讨论】:

    【解决方案3】:

    根据您的需要,您可以创建自己的结构来处理数据类型:

    #include <cstdint>
    
    struct uint256_t
    {
        std::uint64_t bits[4];
    };
    
    uint256_t x;
    

    【讨论】:

      【解决方案4】:

      __int128
      __uint128

      ​​​​​​​​​​​​​​​​​​​​​​​​​​​​

      【讨论】:

      • __int128 未在 Microsoft Visual 上启用
      • @BrendanWebster 你能启用它吗?
      【解决方案5】:

      标准

      C 和 C++ 标准明确允许扩展整数类型。

      C++11

      C++11 N3337 draft 3.9.1 “基本类型”第 3 段说:

      有五种标准的有符号整数类型:“signed char”、“short int”、“int”、“long int”和“long long int”。在此列表中,每种类型提供的存储空间至少与列表中它前面的类型一样多。也可能有实现定义的扩展有符号整数类型。标准和扩展的有符号整数类型统称为有符号整数类型。普通整数具有执行环境架构所建议的自然大小,提供其他有符号整数类型以满足特殊需求。

      您还应该考虑intmax_t,18.4.1“标题概要”第 2 段说:

      头文件定义了与 C 标准中的 7.18 相同的所有函数、类型和宏。

      C99

      C99 N1256 draft 在 6.2.5 “类型”第 4 段明确允许它们:

      有五种标准有符号整数类型,指定为signed char、short int、int、long int 和long long int。 (这些和其他类型可能是 以几种额外的方式指定,如 6.7.2 所述。)也可能有实现定义的扩展有符号整数类型。28)标准和扩展有符号整数类型统称为有符号整数类型。29)

      和 7.18.1.5 “最大宽度整数类型”第 1 段说:

      以下类型指定一个有符号整数类型,能够表示任何有符号整数类型的任何值:

      intmax_t

      【讨论】:

      • intmax_t 基本上是long long
      【解决方案6】:

      总结...

      如果您需要存储不适合“long long”的精确整数值,gcc 提供了__int128 类型。 这是一个 gcc 扩展,不是标准 C++ 的一部分(在撰写本文时)。

      如果您需要使用更大的精确整数值,您可能需要arbitrary-precision arithmetic package,例如GMP。如果您的需求非常有限,您可以推出自己的扩展精度代码,但这很快就会变得比使用现有库更复杂(效率和可靠性更低)。

      如果您需要存储较大的数字但不需要精确存储较大的值,您可以使用 floatdouble:这些可以表示更大的数字量级,但较少precision

      当然,如果你只是想占用更多内存,声明一个数组;-)

      【讨论】:

      • 一种可能性是使用streampos,具体取决于所需的大小?
      • @jorgen streampos 通常可能没有帮助,因为 C++ 11 说“它是基本有符号整数类型之一的 typdef...”
      【解决方案7】:

      如果您知道您的号码始终是正数,您可以通过将其标记为 unsigned 来扩展 int 的范围

      int myNum; // Range is from –2,147,483,648 to 2,147,483,647

      unsigned int myNum; // Range is from 0 to 4,294,967,295

      【讨论】:

        【解决方案8】:

        您可以查看 BigInt 类... http://sourceforge.net/projects/cpp-bigint/

        (还有很多其他的 BigInts...)

        【讨论】:

          【解决方案9】:

          你可以使用

          #include <boost/multiprecision/cpp_int.hpp>  
          using namespace boost::multiprecision;
          

          使用大于 long long int 的数据类型,数据类型为 cpp_int Ref

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-12-20
            • 1970-01-01
            • 1970-01-01
            • 2011-05-08
            • 2019-12-12
            • 1970-01-01
            • 1970-01-01
            • 2012-10-12
            相关资源
            最近更新 更多