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

标签 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;
}

保存和使用这个数字的最佳方式是什么?

最佳答案

将其存储为两个 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;
}

输出:

result in hex is 56bc75e2d63100000

关于c - 如何在 C 中存储值 10^20?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18165641/

相关文章:

c++ - 如何在 Protobuf 中声明 unsigned long long?

c++ - 为什么不会自动分配 long long 类型的值?

使用 malloc 时出现编译器错误(需要左值作为赋值的左操作数)

我可以纯粹在 RAM 中初始化和使用 USB-CDC 吗?

在 Segmentation Violation 后恢复生机

c++ - 从 istringstream 获取带后缀的 long long (C++)

c - 获取一个很长的数字的前两位

c - 验证 C 中 long long Int 行为异常

c - 出现段错误但看不到错误?

c - 尝试终止一个字符数组并在之后打印