为什么printf输出零为非零的double?

我有一段代码:
Windows MSVC 2012

 #include <stdio.h> #include <string.h> namespace myname{ double var = 42; } extern "C" double _ZN6myname3varE = 10.0; int main(){ printf("%d\n", _ZN6myname3varE); return 0; } 

输出是0 。 但是我认为输出应该是10 。 你能帮忙解释一下为什么?

Solutions Collecting From Web of "为什么printf输出零为非零的double?"

回答“ 但我想知道为什么0输出?这是怎么发生的? ”。

double是64位, int32-bit 。 当double被截断为int (因为使用了%d ),只有存储在double存储单元中的前4个字节才会被带入int值。

这里, double _ZN6myname3varE值是10.0 ,十六进制是0x4024000000000000 ,在内存(小端)存储为00000000 00002440 。 所以,截断为int ,只有4个字节的LSB被采用,这显然是zero

 printf("%d\n", _ZN6myname3varE); 

%d应该改为%f ,它打印类型double

但还有另外一个问题: 名字混乱 。 当我用gcc测试程序时,显示错误:

错误:符号“_ZN6myname3varE”已被定义

问题是名称_ZN6myname3varE是C ++中的保留标识符,因为它以下划线和大写字母开头。