Я работал над этой программой, и я заметил, что использование %f для двойного и %d для плавания дает мне что-то совершенно другое. Кто-либо знает, почему это происходит?
int main ()
{
float a = 1F;
double b = 1;
printf("float =%d\ndouble= %f", a, b);
}
Это - вывод
float = -1610612736
double = 190359837192766135921612671364749893774625551025007120912096639276776057269784974988808792093423962875123204096.0000
Из-за того, как работают параметры переменных, C не имеет представления о типе значения, которое вы ему фактически передаете, кроме % d
и % f
. Когда вы передаете параметр переменной, вы в основном делаете (void *) & myvalue
, потому что ни компилятор, ни функция во время выполнения не могут определить тип переменной, за исключением того, что указано в строке форматирования. Таким образом, даже если доступно неявное преобразование, компилятор не знает, что оно необходимо.
В большинстве систем double - это 8 байтов, а float - 4 байта. Таким образом, эти два типа не являются двоично-совместимыми как таковые. И это все равно, что пытаться интерпретировать строку как двойной или какой-то другой несовместимый тип.
% d печатает целое число, поэтому ваш printf интерпретирует вашу переменную a как int.
В gcc 3.4.6 я получаю 0 для обоих значений в вашем коде (после снятия F с инициализации, так как это привело к ошибке компилятора). Я подозреваю, что это связано с той частью переменной, которая интерпретируется как int, равной 0, а затем компилятор сбивается с толку ... (возможно, есть лучшее объяснение, но я не могу его придумать).
Использование% f для обеих переменных дает мне 1.000000 для обеих переменных.
Вы можете найти список символов преобразования внизу этой страницы:
http://www.exforsys.com/tutorials/c-language/managing-input-and-output-operations-in-c .html
% d
обозначает десятичное число и ожидает аргумент типа int
(или некоторого меньшего целочисленного типа со знаком, который затем получает повышен). Типы с плавающей точкой float
и double
оба передаются одинаково (повышены до double
), и оба используют % f
. В C99 вы также можете использовать % lf
для обозначения большего размера double
, но это чисто косметический характер (обратите внимание, что с scanf
не происходит продвижения, и это фактически имеет значение).
Это связано с внутренними представлениями данных. Вы пытаетесь вывести float, как будто это int, который имеет совершенно другое внутреннее (двоичное) представление.
Случай с double аналогичен. Вероятно, после переменной float у вас есть мусор (любые данные). Этот мусор интерпретируется как часть двойного значения.