2016-01-01 5 views
-4

Я столкнулся с проблемой при делении двух чисел и отображении результата с помощью printf. Там я получаю странные цифры.Вывод отдела и printf

С std::cout все работает отлично, но не с printf, почему?

Я всегда работаю с printf() как выход экрана и знаю, что можно работать с std::cout. (Тот же результат)

int a; 
int b; 

float z = (float)a/(float) b; 
printf("%d", z); 
+1

В чем проблема __exactly__? Прочтите свой вопрос вслух. «Я получаю странные цифры там» - ужасное описание проблемы. –

+1

Когда вы используете '% d', аргумент должен быть' int', а не 'float'. При вызове переменных функций нет автоматического преобразования. – Barmar

+0

Предположительно, почему 'printf («% d », somefloat);' не печатает целочисленное значение (sane) для float? –

ответ

1

Поскольку printf является VARIADIC функция, аргументы только пройти стандартные преобразования (например, char преобразуется в int), они не будут автоматически преобразуются в тип соответствующего для формата. Спецификатор %d требует, чтобы его аргумент был int, но вы дали ему float, поэтому результаты являются мусором. Для печати float следует использовать %f:

printf("%f", z); 

При использовании cout << z это не является необходимым, поскольку << использует функцию перегрузку для выполнения типоспецифической форматировании.

0

Способ, которым работают printf, заключается в том, что он принимает «вариационные параметры». Это означает, что аргументы не известны внутри printf, вместо этого используется некоторый «волшебный» код для их возврата. printf использует строку формата, в данном случае "%d", чтобы определить, какой тип аргумента - int в случае "%d". Поскольку z на самом деле является float, он напечатает целочисленное представление z - это, вероятно, какое-то действительно большое количество. [1]

Вы должны исправить свой код, чтобы использовать нужный формат, в этом случае "%f" кажется хорошим выбором.

Большинство современных компиляторов также имеют возможность проверить соответствие строк формата и фактических аргументов, поэтому вы должны включать предупреждения при компиляции кода, чтобы дать вам осмысленное (ish) сообщение о том, что вы не передали правильный аргумент ,

[1] В x86-64 на Linux по крайней мере аргумент float передается в регистры SSE и сохраняется в отдельном куске памяти, поэтому несогласованные аргументы не будут печатать целочисленное представление float, оно напечатает некоторые " случайный "номер, из которого были бы отправлены целые числа.

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