c++ - 长整型 - long类型




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

不要使用双重,因为:

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

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

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


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

使用long long ,如果可能的话,添加一个编译时断言,这种类型足够宽(像sizeof( long long ) >= 8 )。

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


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


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


如果你的编译器没有很长的时间,你可以用一个包含两个long的结构来实现它们,但是你需要谨慎的进行等等。你当然可以寻找像GMP这样的多重精度算法



很多当前的C / C ++编译器都有stdint.h或者inttypes.h头文件。

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


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

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

所以先做:

#include <stdint.h>

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


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

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

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

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





types