2013-07-17 81 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保留標識符++,因爲它以下劃線和大寫字母開始。