无符号长长不会存储大数字
unsigned long long won't store big numbers
我对C/c++ unsigned long long
类型感到困惑,因为理论上它应该存储最多2^64-1,这是19位十进制数字,但以下代码:
unsigned int x = 1000000u; //(One million)
unsigned long long k = (x*x);
cout << k << endl;
输出3567587328,这是不正确的。现在1,000,000^2的结果是1,000,000,000,000 -一个12位的十进制数,远远低于偶数signed long long
的极限。这是怎么发生的?这和我现在运行的系统有关系吗?(32位Ubuntu)
如果我需要一个64位的系统来实现64位的操作,那么另一个问题出现了:大多数编译器使用线性同余生成器生成随机数,如下所示:
x(t) = (a*x(t-1) + c) mod m.
a
和c
通常为32位大数,m为2^32-1
因此,在进行模运算之前,a*x(t-1)
很有可能得到一个64位的数字。
如果需要64位系统,那么gcc如何在16-32位机器上生成随机数?
万分感谢
当然k
是unsigned long long
,但x
是unsigned int
,因此x*x
也是。表达式被计算为unsigned int
,当超出unsigned类型的限制时,会导致通常的绕行。伤害完成后,将转换为unsigned long long
。
可能的修复:
- make
x
andunsigned long long
-
unsigned long long k = ((unsigned long long)x*(unsigned long long)x);
-
unsigned long long k = (1ULL*x*x);
x
是unsigned int
-> x*x
也是unsigned int
。如果乘法的结果超过unsigned int
的最大值,则发生环绕。只有在这些操作之后,结果才被赋值给接收变量(k
)。如果你想让结果是unsigned long long
,你需要至少提升一个操作数为这种类型,例如:unsigned long long k = (unsigned long long)x * x;
.
关于你的第二个问题:编译器通常不生成数字,这是在运行时完成的。我不知道你是从哪里得到公式x(t) = (a*x(t-1) + c) mod m
的。假设这确实是公式,有一些方法可以保持中间结果有界:模运算可以应用于任何操作数或中间结果,而不会改变结果。因此,x(t) = (a*x(t-1) + c) mod m = (a mod m) * (x(t-1) mod m) + c mod m
.
当您将unsigned int
乘以右侧的unsigned int
时,结果是unsigned int
。因此,它与两个数字相乘具有相同的限制,无论该值随后被赋给unsigned long long
。
但是,如果您将unsigned int
变量强制转换为unsigned long long
,则结果将是unsigned long long
,并且该值将不限于unsigned int
的大小。
unsigned long long k = (((unsigned long long)x)*((unsigned long long)x));
- 我应该以字符形式存储数字以节省内存吗?
- 将大数字(10-12 位数字)存储在无序映射中<字符串,整数>
- 如果char可以在C++中存储数字,为什么我们需要int
- 如果静态变量只为程序的整个部分存储了一个副本,为什么我不能使用静态变量交换 2 个数字?
- 引发未经处理的异常:简单 C++ 程序中的读取访问冲突,动态增加数组长度以存储数字
- 将非数字字符串存储为二进制整数
- 我在一个生成随机数的程序工作,我想将这些数字存储在一个数组中
- 如何在整数数组中有效地存储大量数字?C++
- 如何在 C++ 中将 2 个数字存储在 32 位数字中
- 两个大数字的模型存储为字符串
- 为什么 al_draw_textf() 打印数字而不是存储在字符串变量中的字母
- C++将存储在链表中的两个大数字相乘
- 我如何将数字存储在循环中
- 如何仅将数字值存储在给定输入文件中的2D数组中?(没有指针)
- C++ - 将数字表从文件读取到 2D 数组中(仅存储最后一行)
- 读取文件中的数字数量无限,存储在数组中(无空间)
- 需要将n个数字存储在动态数组中
- 制作一个数组,将计算出的数字存储在内存中
- 将整数的每个数字存储到可能的字符数组中
- 如果我将数字存储为整数数据类型,如何检查另一个数字中是否存在一个数字