为什么printf输出零为非零双?

时间:2013-07-17 03:47:47

标签: c++ windows printf

我有一段代码:
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。你能帮忙解释一下原因吗?

2 个答案:

答案 0 :(得分:2)

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

double为64位,int32-bit。当double被截断为int时(因为使用%d),只有存储在4内存位置的第一个double字节才会被带入int 1}}值。

此处,double _ZN6myname3varE的值为10.0,十六进制为0x4024000000000000,并在内存中存储为00000000 00002440(小端)。因此,当截断为int时,仅采用4字节LSB,显然是zero

答案 1 :(得分:0)

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

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

但还有另一个问题:名称错误。当我在gcc中测试程序时,它显示错误:

  

错误:符号`_ZN6myname3varE'已定义

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