长和 int 不够,双倍不起作用

long and int not enough and double wouldn't work

本文关键字:不起作用 int 不够 长和      更新时间:2023-10-16

我正在使用C++,我听说并经历了可以存储在int中的最大值和long是相同的。

,但我的问题是我需要存储一个超过最大值的数字long变量。double变量的大小足够漂亮。

但是问题是使用double变量避免我使用操作员%,这是更轻松地编码我的功能所必需的似乎没有其他方法。

所以请您告诉我一种实现目标的方法吗?

这取决于目的。要获得更好的答案,请给我们更多的上下文

看看(unsigned) long long或GMP

您可以使用类型long long intunsigned long long int

要知道Untegral类型可以包含的最大值,您可以使用以下结构,例如

std::numeric_limits<long long>::max();

要使用它,您必须包括标题<limits>

因此,您要计算大整数的模量。您可能正在加密99%,这很难。您的问题意味着您应该为您的顶级问题(加密)寻找一些现成的解决方案。

无论如何,标准答案否则将库用于大精确整数,例如gnu mp。

#include <cmath>
int main ()
{
    double max_uint = 4294967295.0;
    double max1 = max_uint + 2.0;
    double max2 = (max1 + 1.0) * (max_uint + 1.0);
    double f = fmod(max2,max1);
    return 0;
}

max1max2都超过unsigned int限制,fmod返回正确的max2 % max1结果,这也超过了Unsigned INT限制:f == max_uint + 1.0

编辑:

来自AnatoLyg的好提示:此方法仅适用于2^52的整数。这是因为Double的Mantissa具有52位,并且每个较高的整数仅以精确损失表示。例如。2^80可以==(2^80) 1和==(2^80) 2,依此类推。整数越高,注册者越高,因为代表整数的密度变得更宽。

但是,如果您只需要与32位相比需要额外20位,并且没有其他可能性使用内置的积分类型(我认为常规%更快),那么您可以使用此...

首先,int和长型

之间有区别

但是要解决问题,您可以使用

未签名的长int

这是您在C 中期望的一些尺寸的列表:

char      : 1 byte
short     : 2 bytes
int       : 4 bytes
long      : 4 bytes
long long : 8 bytes
float  : 4 bytes
double : 8 bytes 

我认为这清楚地解释了您为什么遇到困难,并给您暗示如何解决它们