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




long类型 (12)

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

我应该使用什么类型(长时间,或双重或其他)?


双打是浮点。 你应该使用很久,可能。 我不知道哪个别名是首选的。


我用

uint64_t

但这不是标准。


不要使用双重,因为:

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的结构来实现它们,但是你需要谨慎的进行等等。你当然可以寻找像GMP这样的多重精度算法


我会假设你的数字将适合64位。 如果不是,那么你需要一个任意精度的算术库 ,如GMP

从理论上讲,用C ++来做64位数学并不容易,可移植。 实际上,大多数C ++编译器也支持“旧式”C头文件,而C99有一个很好的头文件stdint.h

所以先做:

#include <stdint.h>

然后使用类型int64_t (signed)和uint64_t (unsigned)。


尝试TTMath 。 所有你需要做的是包含一个头,然后声明一个bignum类型,如:

typedef ttmath::UInt<100> BigInt;

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

当然,你可以选择你喜欢的任何大小的模板参数。 100可能是矫枉过正;-)

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


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

举行一个非常大的数字,超过双倍的规模,创造一个对象,它有两个部分 - 数量和权力十,

所以,如果你想存储类似的东西

1.1230123123 x 10 ^(100000000000000000000000000000000000),这是不支持的双,你可以有1.123 ...部分存储在一个双,然后十的权力作为一个单独的双/整型/浮动(无论西装),然后从那里拿走 当然,这可能不是最好的方法 - 而且你可能不得不在很多功能上进行编码,减法等等,但是它肯定是可移植的,就像你使用正常的数据类型一样。 这个的可用性取决于你想要达到的目标,以及你是否打算在单个项目之外使用它,但是如果这些数字是绝对需要的,我认为这是一个可行的方法


你的程序应该如何移植? TR1有cstdint和stdint.h,因此可能受到大多数最新编译器的支持。 然后,如果不支持cstdint,则应该可以使用Boost cstdint.hpp。


两个提议都不好,因为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

如果你不需要负数,你可以得到无符号长整数的声音。


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





types