如何在C中存储10 ^ 20的值?

use*_*521 0 c long-long

我想将两个数量相乘10^10,得到的大小10^20就是2^66.

我想将该数字存储在C中的标准数据类型中.我宁愿不使用"GNU MP Bignum库".

为什么以下C程序没有正确保存数字?

#include<stdio.h>
typedef long long int ull;
int main(){

    ull n1 = 10000000000LL;
    ull n2 = 10000000000LL;

    printf("%llu",n1*n2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

保持这个数字并使用它的最佳方法是什么?

dra*_*oot 6

将其存储为两个long long值.这是一个解决方案的草图:

#include <stdio.h>

typedef unsigned long long ull;

void multiply( ull a, ull b, ull * lo, ull * hi )
{
  ull ah = a >> 32;
  ull bh = b >> 32;
  ull al = a & 0xFFFFFFFF;
  ull bl = b & 0xFFFFFFFF;

  ull mid = ah * bl + al * bh;
  ull albl = al * bl;

  ull imm = mid + ( albl >> 32 );

  *lo = ( mid << 32 ) + albl;
  *hi = ah * bh + ( imm >> 32 );
}

int main()
{
  ull n1 = 10000000000LL;
  ull n2 = 10000000000LL;

  ull lo, hi;

  multiply( n1, n2, &lo, &hi );

  printf( "result in hex is %llx%016llx\n", hi, lo );
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

result in hex is 56bc75e2d63100000
Run Code Online (Sandbox Code Playgroud)