我出生在现代世界,所以我不经常需要处理这类事情,但有人可以解释如何在以下代码中获得正确的数字。 这是许多人的一次尝试:
#define X 2527
#define Y 2463
#define Z 3072
main()
{
long int c = X*Y*Z;
printf("%ld",c);
}
我只是想打印一个长整数,但总是打印错误的结果。我得到整数溢出 - 如果是这样我怎么能防止它们?或者它是我选择的printf格式化程序吗?
答案 0 :(得分:8)
溢出是可以的,因为您尝试将34位数写入32位变量(long int
)。
在格式字符串中使用long long int
和%lld
。
#define X 2527LL
#define Y 2463LL
#define Z 3072LL
main()
{
long long int c = X*Y*Z;
printf("%lld",c);
}
答案 1 :(得分:3)
问题是常量不会被解释为长整数,只有在计算表达式后才会转换为长整数。您可以在表达式中转换它们来解决这个问题,或者只是将它们定义为长常量。另外,如果长度可能不够,则应该使用long long代替它。
答案 2 :(得分:1)
是的,你正在溢出。答案将不适合32位有符号整数,long int为。你必须使用64位类型,这很长。
另外,你应该进行类型转换,否则中间计算会溢出。
#define X 2527
#define Y 2463
#define Z 3072
main()
{
long long c = (long long)X*Y*Z;
printf("%lld",c);
}
答案 3 :(得分:0)
#define X 2527.0
#define Y 2463
#define Z 3072
main()
{
double c = X*Y*Z;
printf("%lf",c);
}
你也可以使用双倍。