我试图通过C程序乘以10000
和10000 + 1
等数字。但我没有得到正确的输出。
printf("%lld",(100000)*(100001));
我在不同的编译器上尝试了上述代码,但我得到的是1410165408
而不是10000100000
。
答案 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)