我有一个整数变量,可以得到一个大于4294967295的值。
我应该使用哪种类型(长,长或其他)?
答案 0 :(得分:14)
使用long long
并尽可能添加一个编译时断言,该类型足够宽(如sizeof( long long ) >= 8
那样)。
double
用于浮点数,而不是整数。
答案 1 :(得分:13)
答案 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_t
或int64_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(无论如何)适合),然后从那里拿走它。当然,这可能不是最好的方法 - 你可能不得不为分割,减法等编写很多功能,但它肯定是可移植的,因为你将使用定义的普通数据类型。这种可用性取决于你想要达到的目标,以及你是否计划在单个项目之外使用它,但我认为如果这些数字是绝对要求的话,这是一种可行的方法