printf отображает что-то странное - PullRequest
6 голосов
/ 15 сентября 2011

Есть такой код:

#include <stdio.h>

int main() {
  float d = 1.0;
  int i = 2;
  printf("%d %d", d, i);
  getchar();
  return 0;
}

И вывод:

0 1072693248

Я знаю, что в printf есть ошибка, и первый% d следует заменить на% f. Но почему переменная i печатается неправильно (1072693248 вместо 2)?

Ответы [ 5 ]

11 голосов
/ 15 сентября 2011

Поскольку вы указали %d вместо %f, то, что вы действительно видите, это двоичное представление d в виде целого числа.

Кроме того, поскольку типы данных не совпадают, код фактически имеет неопределенное поведение.

EDIT:

Теперь, чтобы объяснить, почему вы не видите 2:

float повышается до double в стеке. Тип double имеет (в данном случае) 8 байтов. Однако, поскольку ваш printf задает два целых числа (в данном случае оба 4 байта), вы видите двоичные представления 1.0 как тип double. 2 не печатается, потому что он превышает 8 байтов, ожидаемых вашим printf.

4 голосов
/ 15 сентября 2011

printf не просто использует коды формата, чтобы решить, как напечатать свои аргументы.Он использует их, чтобы решить, как получить доступ к его аргументам (он использует va_arg внутри).Из-за этого, когда вы даете неправильный код формата для первого аргумента (%d вместо %f), вы не просто путаете печать первого аргумента, вы заставляете его выглядеть не в том месте для все последующие аргументы .Вот почему вы получаете ерунду за второй аргумент.

1 голос
/ 15 сентября 2011

Вам нужно знать, как работает printf.Вызывающая сторона помещает все аргументы в стек.Когда он анализирует строку fmt, в первый раз, когда он видит% d, он выбирает первое 4-байтовое слово в стеке и печатает его как целое число.Во второй раз, когда он видит% d, он выбирает следующее 4-байтовое слово.То, что вы видите, это необработанные байты с плавающей точкой, отображаемые в виде двух целых чисел.

0 голосов
/ 15 сентября 2011

Число с плавающей запятой хранится в памяти в специальном формате, это не просто число, а несколько десятичных знаков, см. Как представить число FLOAT в памяти в C

0 голосов
/ 15 сентября 2011

Это подписано или без знака?

Используйте это как ссылку: http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/FUNCTIONS/format.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...