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

时间:2009-06-01 11:03:22

标签: c++ types

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

我应该使用哪种类型(长,长或其他)?

14 个答案:

答案 0 :(得分:14)

使用long long并尽可能添加一个编译时断言,该类型足够宽(如sizeof( long long ) >= 8那样)。

double用于浮点数,而不是整数。

答案 1 :(得分:13)

尝试:

http://gmplib.org/大号。

http://mattmccutchen.net/bigint/ big int。

我没有使用过,但我在Java中使用过类似的东西。

答案 2 :(得分:8)

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

答案 3 :(得分:8)

我假设您的数字符合64位。如果没有,那么您需要arbitrary-precision arithmetic library,例如GMP

理论上,在C ++中进行64位数学运算并不容易。实际上,大多数C ++编译器也支持“老式”C头,而C99有一个很好的头文件叫stdint.h

首先这样做:

#include <stdint.h>

然后使用类型int64_t(已签名)和uint64_t(无符号)。

答案 4 :(得分:3)

两个提案都不好,因为long long不是标准的C ++数据类型,double是浮点数。

由于我的程序必须是可移植的,所以我将#define我自己的类型,适合我使用的所有编译器(visual studio和gcc):

#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

答案 5 :(得分:3)

不要使用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

答案 6 :(得分:2)

我用

uint64_t

但这不标准。

答案 7 :(得分:1)

如果你不需要负数,那么你可以得到最多的无符号长音。

答案 8 :(得分:1)

试试TTMath。您需要做的就是包含一个标题,然后声明一个bignum类型,例如:

typedef ttmath::UInt<100> BigInt;

创建一个类型,可以保存0到2 ^(32 * 100)-1之间的无符号整数。 然后只需使用BigInt,只要您使用int

当然,您可以为模板参数选择您喜欢的任何尺寸。 100可能是矫枉过正; - )

刚才意识到,lib只能在x86和x64上运行,但在这些处理器上是OS跨平台的。

答案 9 :(得分:1)

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

int_fast64_tint64_t可能是一个选项(恕我直言最便携)。

答案 10 :(得分:1)

您的计划应该具备多大的便携性? TR1有cstdint和stdint.h所以它可能得到了大多数最新编译器的支持。然后是Boost cstdint.hpp,如果不支持cstdint,你应该可以使用它。

答案 11 :(得分:0)

双打是浮点数。 你应该长时间使用。我不知道哪个别名是首选的。

答案 12 :(得分:0)

如果您的编译器没有很长的时间,您可以使用包含两个long的结构自己实现它们,但是您需要谨慎使用carry等。您当然可以寻找像GMP <这样的多精度算术/ p>

答案 13 :(得分:0)

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

保持一个非常大的数字,超出双倍的范围,创建一个对象,它有两个部分 - 数字和权力到十,

所以,如果你想存储像

这样的东西

1.1230123123 x 10 ^(100000000000000000000000000000000000),这是双重不支持的,你可以将1.123 ...部分存储在一个double中,然后将十的幂作为一个单独的double / int / float(无论如何)适合),然后从那里拿走它。当然,这可能不是最好的方法 - 你可能不得不为分割,减法等编写很多功能,但它肯定是可移植的,因为你将使用定义的普通数据类型。这种可用性取决于你想要达到的目标,以及你是否计划在单个项目之外使用它,但我认为如果这些数字是绝对要求的话,这是一种可行的方法