Переменная объявляется как float f = 5.2, но пока используется печать% d, я не получил o / p, так как 5 печатает некоторое значение мусора - PullRequest
0 голосов
/ 04 января 2011
/* Compiled uisng GCC Compiler in CentOs 5   */

#include <stdio.h>
int main(void)
{
    float f = 5.2;
    printf("f = %d\n",f);
    return 0;
}

/*  O/p is not 5 its printing some garbage value  */

Почему вывод не 5?Что такое представление значений с плавающей запятой в памяти?

Ответы [ 2 ]

7 голосов
/ 04 января 2011

"%d" печатает десятичное целое число.Это означает, что printf интерпретирует то, что передается как целое число, а не как число с плавающей точкой.Это не делает никакого умного преобразования, и я почти уверен, что это неопределенное поведение.

Представление с плавающей точкой в ​​памяти зависит от реализации.В большинстве реализаций используется IEEE 754 , но это совсем не гарантируется.

Для записи с использованием "-Wall -Wextra" с gcc эта ошибка будет воспринята как предупреждение.Если вы хотите напечатать его как целое число, вы должны также разыграть его:

printf("f = %d\n",(int)f);
2 голосов
/ 04 января 2011

Ваш код не печатается 5, потому что вы не даете его 5. Вы даете это 5.2. 5 является целочисленным значением, а 5.2 является значением с плавающей запятой. Первый типично кодируется с использованием дополнения 2s, а второй обычно кодируется с использованием значений с плавающей запятой IEEE. (Существуют и другие возможные и даже иногда используемые кодировки, но две, с которыми вы, скорее всего, столкнетесь, это две, которые я упомянул.)

Если вы сообщаете компьютеру, что задаете ему целое число (%d), а затем переходите к присвоению ему значения с плавающей запятой (5.2), получение мусора - это то, что вы ожидаете. Он берет биты представления IEEE с плавающей запятой и читает их, как если бы это было целое число. (Это старая формула: мусор входит, мусор выходит.) Если вы попытаетесь не лгать компьютеру, вы получите лучшие результаты.

Код, который вы хотите использовать в своем вызове printf: %f вместо %d. Использование этого означает, что вы больше не врете компьютеру о типе передаваемых данных. При этом, чтобы избежать неизбежного следующего вопроса, обязательно прочитайте это объяснение с плавающей запятой , поэтому вы понимаете, почему ваши числа с плавающей запятой не такие, как вы думаете.

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