2013-07-17 2 views
1

У меня есть кусок кода:
Под Windows MSVC 2012Почему printf выводит ноль для ненулевого двойника?

#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/ what-are-the-rules-about-use-an-underscore-in-ac-identifier) ​​ – chris

+2

Голосование для удержания, поскольку описанная проблема вызвана простым недоразумением (% d вместо% f). – jogojapan

ответ

2

Ответа на этот вопрос «Но я хочу знать, почему вывод 0? Как это происходит?».

double - 64-разрядный и int - 32-bit. Когда double усечен до int (из-за использования %d), только первый 4 байт, хранящийся в ячейке памяти double, берется в значение int.

Здесь значение double _ZN6myname3varE является 10.0, который 0x4024000000000000 в шестнадцатеричном и хранится в виде 00000000 00002440 в памяти (Little Endian). Таким образом, при усечении до int берется только 4 байта LSB, который, очевидно, zero.

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

%d должен быть изменен на %f, который печатает тип double

Но есть еще одна проблема: имя коверкая. Когда я тестировал программу в НКУ, он показывает ошибку:

Error: symbol `_ZN6myname3varE' is already defined

Проблема это имя _ZN6myname3varE является зарезервированным идентификатором в C++, поскольку он начинается с подчеркивания и заглавной буквы.

Смежные вопросы