乘以两个长数

kun*_*yal 3 c multiplying

我曾尝试乘为数字,即1000010000 + 1通过C程序.但我没有得到正确的输出.

printf("%lld",(100000)*(100001));
Run Code Online (Sandbox Code Playgroud)

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

Dmi*_*nko 6

好吧,让我们倍增

  int64_t a = 100000;
  int64_t b = 100001;
  int64_t c = a * b;
Run Code Online (Sandbox Code Playgroud)

我们会得到(二进制)

     1001010100000011010110101010100000 /* 10000100000 decimal */
Run Code Online (Sandbox Code Playgroud)

但如果你把它转换成 int32_t

  int32_t d = (int32_t) c;
Run Code Online (Sandbox Code Playgroud)

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

       01010100000011010110101010100000 /* 1410165408 decimal */
Run Code Online (Sandbox Code Playgroud)

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

  printf("%lld",(100000LL)*(100001LL));  
Run Code Online (Sandbox Code Playgroud)


Lun*_*din 5

在C中,用于计算的类型是根据操作数的类型确定的,而不是从存储结果的类型确定的.

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

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

这里所有邪恶的根源是C中糟糕的默认类型(出于某种原因称为"原始数据类型").只需摆脱它们及其所有不确定因素,您的所有错误都将随之消失:

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

int main(void) 
{
  printf("%"PRIu64, (uint64_t)100000 * (uint64_t)100001);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

或者相当于:UINT64_C(100000) * UINT64_C(100001).