【发布时间】:2010-09-08 17:22:36
【问题描述】:
#include <stdio.h>
int main(void)
{
double resd = 0.000116;
long long resi = 0;
printf("%lld %f %lld %f\n", resd, resd, resi, resi);
return 0;
}
提供(Linux、gcc、x64)
0 0.000116 0 0.000116 ^^^^^^^^ 奇数,因为 resi 的内存归零实际上,用 g++ 编译它会给出随机结果,而不是第二个 0。
我知道我给printf 提供了无效的说明符,它会触发unspecified 未定义的行为,但我想知道为什么会发生这种特定的损坏,因为long long 和double 具有相同的大小。
【问题讨论】:
-
it triggers unspecified behavior... nuff 说:P -
@pmg:行为是未定义,并非未指定 (7.19.6.1.9)。有区别。
-
@Martin:标准不能解释,但还是可以解释的;行为是未定义的,不是不确定的。这是一个真正的问题,与 C 语言无关。
-
@Martin 我添加了标签调用约定和 x64。这实际上就是这个问题的意义所在。
标签: c linux 64-bit printf calling-convention