преобразование из int в float в C изменяет значение - PullRequest
2 голосов
/ 27 октября 2009

Привет, я пытаюсь преобразовать int в float в C, и по какой-то причине приведение меняет значение, и я не уверен, почему. Итак:

fprintf (stderr, "%d,%d\n", rgbValues->green, (float)rgbValues->green);

производит два разных числа. Обратите внимание, что rgbValues->green является int.

Есть идеи, почему это происходит?

Спасибо

Ответы [ 3 ]

10 голосов
/ 27 октября 2009

Вы должны сказать это в строке формата. Использование:

fprintf(stderr, "%d,%f\n", rgbValues->green, (float)rgbValues->green);
                     ^

вместо:

fprintf(stderr, "%d,%d\n", rgbValues->green, (float)rgbValues->green);
                     ^

Обратите внимание на изменение с d на f (окружность ^ не является частью кода, а просто индикатор того, где искать).

6 голосов
/ 27 октября 2009

Спецификатор формата %d говорит printf: «уберите следующие 4 байта из стека, интерпретируйте их как целое число и распечатайте это целое число». Поскольку вы фактически передаете float в качестве параметра, байты float (которые хранятся в формате IEEE-754 ) неправильно интерпретируются как целое число, отсюда и различные значения. (На самом деле, float преобразуется в double из-за продвижения аргументов в функциях с переменными числами, и это первые 4 байта этого продвинутого double, которые интерпретируются как целое число.)

Правильным решением является использование одного из спецификаторов формата %e, %f или %g вместо %d при распечатке float. %e говорит: «возьмите следующие 8 байтов из стека, интерпретируйте их как double и распечатайте их с использованием научной (экспоненциальной) записи» %f распечатывает с использованием формата с фиксированной запятой и %g печатает в зависимости от того, что будет короче %e или %f.

fprintf(stderr, "%d,%f\n", rgbValues->green, (float)rgbValues->green);
0 голосов
/ 27 октября 2009

Расширяя @ Ответ AraK , вы приводите один раз к float, а затем printf интерпретирует этот битовый шаблон как int в строке спецификатора формата. Он делает точно , что вы говорите ему делать:)

Если вы хотите только привести к float - сделайте это:

// format specifier is %d for int, %f for float
// show the cast value of rgbValues->green as well as its "real" value
fprintf(stderr, "%d,%f\n", rgbValues->green, (float)rgbValues->green); 

Редактировать - формулировка на основе комментариев

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