我有一段代码:
在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
。你能帮忙解释一下原因吗?
答案 0 :(得分:2)
回答“但我想知道为什么输出0?这是怎么发生的?”。
double
为64位,int
为32-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 ++中的保留标识符,因为它以下划线和大写字母开头。