2013-07-17 45 views
1

我有一段代码:
Windows MSVC 2012为什么printf为非零的double输出零?

#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。你能解释为什么吗?

+6

'd' - >'f' ... – Mysticial

+1

我不确定*你想要什么,但它是[保留标识符](http://stackoverflow.com/questions/228783/)什么是关于使用下划线在交流标识符) – chris

+2

投票搁置,因为所描述的问题是由一个简单的误解(%d而不是%f)造成的。 – jogojapan

回答

2

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

double是64位并且int32-bit。当double被截断为int(因为使用%d),只有存储在double的存储位置中的第一个4字节被带入int值。

这里,double _ZN6myname3varE值是10.0,其是十六进制0x4024000000000000并且如在存储器00000000 00002440(小端)存储。所以,当截取到int时,只有4个字节的LSB被采用,这明显是zero

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

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

但是还有另外一个问题:名字改编。当我在GCC测试的程序,它显示了一个错误:

Error: symbol `_ZN6myname3varE' is already defined

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