代码之家  ›  专栏  ›  技术社区  ›  Igor

C++中大于2 ^ 32的整数使用什么类型?

  •  13
  • Igor  · 技术社区  · 15 年前

    我有一个整数变量,它可以得到大于4294967295的值。

    14 回复  |  直到 15 年前
        1
  •  14
  •   sharptooth    15 年前

    使用 long long 如果可能的话,添加一个编译时断言,证明这个类型足够宽(类似于smth) sizeof( long long ) >= 8

    double

        2
  •  13
  •   Pod    15 年前

    尝试:

    http://gmplib.org/

    http://mattmccutchen.net/bigint/ 大整数。

    我两个都没用过,但我在Java中用过类似的东西。

        3
  •  9
  •   user9876    5 年前

    我假设你的数字是64位的。如果不是,那么你需要一个 arbitrary-precision arithmetic library 例如 GMP .

    stdint.h

    因此,首先要做的是:

    #include <stdint.h>
    

    然后使用类型 int64_t (签名)和 uint64_t (未签名)。

    编辑以添加: 在我写了这个答案之后,C++11添加了 <cstdint> header 它通常*定义std::int64_t和std::uint64_t,所以如果您有现代编译器,最好使用它们。

    (*理论上,系统可能根本不支持64位类型。但实际上,在您可能遇到的任何系统上都支持64位类型)。

        4
  •  7
  •   sharptooth    15 年前

    在C++中没有可移植的方式,因为语言没有指定整数类型的大小(除了sisiof char是1)。您需要查阅编译器文档。

        5
  •  3
  •   Igor    15 年前

    两个建议都不好,因为长的不是标准的C++数据类型,而double是浮点。

    #ifdef WIN32
      #define unsigned_long_long unsigned __int64
      #define long_long __int64
    #else // gcc. Might not work on other compilers!
      #define unsigned_long_long unsigned long long
      #define long_long long long
    #endif
    
        6
  •  3
  •   anon anon    15 年前

    不要使用double,因为:

    cout.setf(ios::fixed);
    cout << LONG_LONG_MAX << endl;
    cout << double(LONG_LONG_MAX) << endl;
    
    cout << LONG_LONG_MAX-100 << endl;
    cout << double(LONG_LONG_MAX-100) << endl;
    

    输出:

    9223372036854775807
    9223372036854775808.000000
    9223372036854775707
    9223372036854775808.000000
    
        7
  •  2
  •   user75832 user75832    15 年前

    uint64_t
    

    但这不是标准。

        8
  •  1
  •   Slartibartfast    15 年前

    如果你不需要负数,无符号的long-long听起来是你能得到的最多的。

        9
  •  1
  •   PowerApp101    15 年前

    尝试 TTMath . 您只需包含一个标头,然后声明一个bignum类型,例如:

    typedef ttmath::UInt<100> BigInt;
    

    它创建了一个可以保存0和2^(32*100)-1之间的无符号整数的类型。 那就用 BigInt 无论你在哪里使用 int .

    刚刚意识到,lib仅适用于x86和x64,但在这些处理器上是跨平台的操作系统。

        10
  •  1
  •   lispmachine    15 年前

    当前很多C/C++编译器都有 stdint.h 或inttypes.h标头。

    int_fast64_t int64_t

        11
  •  1
  •   TrayMan    15 年前

    您的程序应具有多大的可移植性?TR1有cstdint和stdint.h,所以大多数最新的编译器可能都支持它。然后是Boost cstdint.hpp,如果不支持cstdint,您应该可以使用它。

        12
  •  0
  •   alamar    15 年前

    双精度浮点运算。 也许你应该用long-long。我不知道哪个别名是首选别名。

        13
  •  0
  •   David Allan Finch    15 年前

    如果您的编译器没有long-long,您可以使用包含两个long的结构自己实现它们,但您需要小心进位等。当然,您可以寻找一种多精度算法,如 GMP

        14
  •  0
  •   Sbspider    11 年前

    只是出于好奇——我认为如果你愿意,编写自己的代码不会太难。我的意思是,当然,所有这些数据类型都有预定义的结构,但是您可以使用 double 使用指数的结构,并执行如下操作:

    要保持一个非常大的数字,超出双精度的范围,创建一个包含两部分的对象-数字和十的幂,

    所以,如果你想储存像这样的东西

    1.1230123123 x 10^(1000000000000000000000000000000000),不受双精度支持,您可以使用1.123。。。部分存储在一个double中,然后十的幂作为一个单独的double/int/float(任意适合),然后从那里获取它。当然,这可能不是最好的方法——您可能需要为除法、减法等编写大量功能,但它肯定是可移植的,因为您将使用定义的正常数据类型。它的可用性将取决于您试图实现的目标,以及您是否计划在单个项目之外使用它,但我认为如果这些数字是绝对要求的话,这是一种可靠的方法