两个长数相乘

Multiplying two long numbers

我试图通过 C 程序乘以数字,即 1000010000 + 1。但是我没有得到正确的输出。

printf("%lld",(100000)*(100001));

我已经在不同的编译器上尝试了上面的代码,但我得到的是相同的 1410165408 而不是 10000100000

你可以这样做

long long int a = 100000;
long long int b = 100001;
printf("%lld",(a)*(b));

这将给出正确答案。

你正在做的是 (100000)*(100001) 即默认情况下编译器将 100000 变成一个整数并乘以 100001 并将其存储在 (int) 但是在 printf 期间它打印 (int) 为 (long long int)

您的两个整数是 int,这也会使结果 intprintf() 格式说明符表示 %lld,它需要 long long int,这无关紧要。

您可以转换或使用后缀:

printf("%lld", 100000LL * 100001LL);

这会打印 10000100000。当然还有一个限制,因为 long long int 中的位数仍然是常数。

好吧,让我们相乘

  int64_t a = 100000;
  int64_t b = 100001;
  int64_t c = a * b;

我们会得到(二进制)

     1001010100000011010110101010100000 /* 10000100000 decimal */

但如果将其转换为 int32_t

  int32_t d = (int32_t) c;

你只会得到最后32位(并且扔掉顶部10):

       01010100000011010110101010100000 /* 1410165408 decimal */

最简单的方法可能是将两个常量声明为 64 位 值(LL 后缀代表 long long):

  printf("%lld",(100000LL)*(100001LL));  

在 C 中,用于计算的类型由 操作数的类型决定,而不是由存储结果的类型决定。

诸如 100000 之类的普通整数常量属于 int 类型,因为它们将适合一个。 100000 * 100001 的乘法将不适合,因此您会得到整数溢出和未定义的行为。切换到 long 不一定能解决任何问题,因为它也可能是 32 位的。

此外,使用 %lld 格式说明符打印 int 在大多数系统上也是未定义的行为。

万恶之源是 C 中糟糕的默认类型(称为 "primitive data types" 是有原因的)。简单地摆脱它们和它们所有的不确定性,你所有的错误都会随之消失:

#include <stdio.h>
#include <inttypes.h>

int main(void) 
{
  printf("%"PRIu64, (uint64_t)100000 * (uint64_t)100001);
  return 0;
}

或等价物:UINT64_C(100000) * UINT64_C(100001).