Спецификатор формата %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);