C printf использующий %d и %f

Я работал над этой программой, и я заметил, что использование %f для двойного и %d для плавания дает мне что-то совершенно другое. Кто-либо знает, почему это происходит?

int main ()
{
 float a = 1F;
 double b = 1;

 printf("float =%d\ndouble= %f", a, b);
}

Это - вывод

float = -1610612736
double = 190359837192766135921612671364749893774625551025007120912096639276776057269784974988808792093423962875123204096.0000
10
задан skaffman 30 April 2010 в 20:17
поделиться

4 ответа

Из-за того, как работают параметры переменных, C не имеет представления о типе значения, которое вы ему фактически передаете, кроме % d и % f . Когда вы передаете параметр переменной, вы в основном делаете (void *) & myvalue , потому что ни компилятор, ни функция во время выполнения не могут определить тип переменной, за исключением того, что указано в строке форматирования. Таким образом, даже если доступно неявное преобразование, компилятор не знает, что оно необходимо.

В большинстве систем double - это 8 байтов, а float - 4 байта. Таким образом, эти два типа не являются двоично-совместимыми как таковые. И это все равно, что пытаться интерпретировать строку как двойной или какой-то другой несовместимый тип.

5
ответ дан 4 December 2019 в 00:24
поделиться

% 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

0
ответ дан 4 December 2019 в 00:24
поделиться

% d обозначает десятичное число и ожидает аргумент типа int (или некоторого меньшего целочисленного типа со знаком, который затем получает повышен). Типы с плавающей точкой float и double оба передаются одинаково (повышены до double ), и оба используют % f . В C99 вы также можете использовать % lf для обозначения большего размера double , но это чисто косметический характер (обратите внимание, что с scanf не происходит продвижения, и это фактически имеет значение).

4
ответ дан 4 December 2019 в 00:24
поделиться

Это связано с внутренними представлениями данных. Вы пытаетесь вывести float, как будто это int, который имеет совершенно другое внутреннее (двоичное) представление.

Случай с double аналогичен. Вероятно, после переменной float у вас есть мусор (любые данные). Этот мусор интерпретируется как часть двойного значения.

3
ответ дан 4 December 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: