【发布时间】:2013-10-08 14:07:26
【问题描述】:
我的代码:
int main()
{
long long a = pow(2,63) - 1;
long long b = pow(2,63);
double c = pow(2,63) - 1;
double d = pow(2,63);
printf("%lld %lld \n%f %f \n%lld %lld\n", a, b, c, d, (long long)c, (long long)d);
return 0;
}
并且执行结果是(在win7 x64中使用gcc的代码块):
9223372036854775807 9223372036854775807
9223372036854775800.000000 9223372036854775800.000000
-9223372036854775808 -9223372036854775808
问题:
为什么是a == b?
我知道c == d 因为double 的精度。
但是为什么(long long)c 和(long long)d 不是9223372036854775800?
为什么是(long long)c != a 和(long long)d != b?
【问题讨论】:
-
pow返回double,而不是整数。 -
不应该是
%lf而不是%f在你的格式字符串打印双打? -
@SchighSchagh:不,
%lf是为long double服务的;%f用于double(还有float,在作为可变参数传递时提升为double)。 -
@MikeSeymour 嗯,看起来你对浮动提升加倍是正确的,但事实证明
%f和%lf都适用于float和double,而你实际上将%Lf用于long double。顺便说一句,对于scanf,您确实需要将%f仅用于float,而%lf仅用于double。 题外话>