两个长数相乘
Multiplying two long numbers
我试图通过 C 程序乘以数字,即 10000
和 10000 + 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
,这也会使结果 int
。 printf()
格式说明符表示 %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)
.
我试图通过 C 程序乘以数字,即 10000
和 10000 + 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
,这也会使结果 int
。 printf()
格式说明符表示 %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)
.