乘以两个长数

时间:2017-04-10 11:26:18

标签: c multiplying

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

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

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

4 个答案:

答案 0 :(得分:6)

好吧,让我们相乘

     1001010100000011010110101010100000 /* 10000100000 decimal */

我们会得到(二进制)

int32_t

但如果将其转换为 int32_t d = (int32_t) c;

10

你只能获得最后32位扔掉顶部 01010100000011010110101010100000 /* 1410165408 decimal */ ):

LL

最简单的方法可能是将两个常量声明为 64位值(long long后缀代表 printf("%lld",(100000LL)*(100001LL)); ):

    document.write(sum);

答案 1 :(得分:5)

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

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

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

这里所有邪恶的根源是C中的蹩脚的默认类型(出于某种原因称为“原始数据类型”)。简单地摆脱它们以及所有不确定因素,你的所有错误都将随之消失:

#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)

答案 2 :(得分:4)

你的两个整数是int,结果int也是如此。 printf()格式说明符%lld需要long long int,并不重要。

您可以投射或使用后缀:

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

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

答案 3 :(得分:1)

你可以这样做

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

这将给出正确答案。

你正在做的是(100000)*(100001),即默认编译器将100000转换为整数并乘以100001并将其存储在(int)中 但是在printf期间,它将(int)打印为(long long int)