我有一个整数变量,它可能会取大于4294967295的值。
我应该使用什么类型(long long、double或其他类型)?
使用 long long
,如果可能的话,请添加一个编译时断言来确保这个类型足够宽(类似于 sizeof( long long ) >= 8
)。
double
适用于浮点数,而不是整数。
我假设你的数字将适合64位。如果不是,那么你需要一个任意精度算术库,比如GMP。
理论上,在C++中没有一种简单、可移植的方法来进行64位数学运算。实际上,大多数C++编译器也支持“老式”C头文件,并且C99有一个很好的头文件叫做stdint.h。
所以首先要做的是:
#include <stdint.h>
int64_t
(有符号)和uint64_t
(无符号)。在C++中,没有一种可移植的方法来完成这个操作,因为该语言没有指定整数类型的大小(除了sizeof char是1)。您需要查阅编译器文档。
long long
和unsigned long long
类型,它们保证至少有64位宽度,并且还有相应的ll
、ull
字面量。此外,在cstdint
头文件中还提供了int64_t
、int_least64_t
、int_fast64_t
、uint64_t
、uint_least64_t
、uint_fast64_t
类型别名。 - user4832129Don't use double, because:
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
这两个提议都不太好,因为long long不是标准的C++数据类型,double则是浮点数。
由于我的程序需要可移植性,我会定义自己的类型,以适应我使用的所有编译器(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
我使用
uint64_t
但这不是标准做法。
typedef ttmath::UInt<100> BigInt;
这个程序创建了一个类型,可以容纳0到2 ^(32 * 100)-1之间的无符号整数。
然后只需在需要使用int
的地方使用BigInt
。
当然,您可以选择任何模板参数大小。100可能有些过度了;-)
刚刚意识到,该库仅适用于x86和x64,但在这些处理器上是跨平台的。
blah
时出现了“BigInt没有名为blah的成员”的错误(这不应该发生)。如果你尝试一个简单的声明,比如ttmath::UInt<100> blah = 0; blah = blah + 10;
会发生什么? - HostileFork says dont trust SE如果您不需要负数,无符号长整型听起来是您可以获得的最多的。