我是新手,如果我的问题很愚蠢,请承担。
int main()
{
int x=60674;
printf("%lf \n",(double)(x*x));
printf("%lld \n",(long long)(x*x));
return 0;
}
为什么这不起作用?
答案 0 :(得分:5)
x * x
溢出,所以你应该在乘法之前将它们转换为long longs
:
printf("%lld \n",((long long)x * (long long)x));
答案 1 :(得分:1)
另外,您可以使用标准化的商标:
#include <inttypes.h>
#include <stdio.h>
int main() {
int x=60674;
printf("%" PRIu64 "\n",(uint64_t)x * x);
return 0;
}
此外,您不需要转换两个变量.. *将使用两个乘数的较大类型强加。
顺便说一下你可以使用unsigned int ..结果适合UINT_MAX,即4294967295(来自here)
答案 2 :(得分:0)
x
是一个有符号整数,只能保存-2,147,483,847
到+2,147,483,847
以及执行操作时的值
x * x
==> 60674 * 60674 = 3,681,334,276
通常溢出整数范围。因此,您可能需要一些大数据类型来保存该计算60674 * 60674
你可以尝试两件事来做到这一点。
将x
的数据类型从int
更改为long
或更多范围long long
long long x = 60674;
键入将计算转换为长程数据类型。
printf("%lld \n",((long long)x* (long long)x));