3
int main()
{
    unsigned long long key = 21739827982173982173921739217392173217397213271832193721973291732917321732132173971317382173213782163872163872163872163872163826176728328621321487219372198371298775647326409817402198732198432974329479832749173821732198732173217392173721372193728193782193792173921732171;
}

编译器说我要分配的数字对于所选类型来说太大了。如何存储它然后执行操作?

4

3 回答 3

6

C 对此没有任何内置支持。您需要一个“bignum”库(也称为“任意精度算术”或“多精度算术”库)。 GNU MP有据可查并且很受欢迎。

编辑:我刚刚注意到您的变量被命名为“key”,并且该数字似乎大约有 900 位长。您是否尝试实施RSA?如果是这样,您真的应该使用经过良好测试的密码库;您可以在 RSA 实现中犯许多细微的错误,这些错误会损害您的安全性。那里的选项包括gcryptNSSOpenSSL。如果您可以与 libgcrypt 许可证兼容,我强烈建议您使用它,因为它的 API 和文档比其他两个要好得多。

于 2012-11-01T17:42:43.217 回答
3

你可以从这里得到一个任意精度的整数库。

http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic#Arbitrary-precision_software

您可以使用任意精度库来处理大数字。

或者

您可以使用 double - 它的范围约为 300 位,但精度只有 53 位,因为它存储为两部分,一个指数和一个尾数。53 位为您提供 15-18 位精确范围内的数字

于 2012-11-01T17:43:58.823 回答
1

在大多数情况下,如果不是所有情况,您都需要一个大整数或任意精度的数学库。(C 的整数类型很少有那么大;可能会有专门的编译器发生,但它们根本不是主流。即使你设法找到这样的编译器,你的代码也不会是可移植的。)

检查GMP

于 2012-11-01T17:43:21.507 回答