我曾尝试乘为数字,即10000与10000 + 1通过C程序.但我没有得到正确的输出.
printf("%lld",(100000)*(100001));
Run Code Online (Sandbox Code Playgroud)
我已经在不同的编译器上尝试了上面的代码但是我得到了相同1410165408而不是10000100000.
好吧,让我们倍增
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)
在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).