1

我有一段代码:
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. 你能帮忙解释一下为什么吗?

4

2 回答 2

2

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

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

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

于 2013-07-17T04:10:13.370 回答
0
printf("%d\n", _ZN6myname3varE);

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

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

错误:符号 `_ZN6myname3varE' 已定义

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

于 2013-08-16T16:48:55.213 回答