Как вывести шестнадцатеричное значение из функции, которая принимает входные данные с плавающей точкой

#c #if-statement #hex #return-value

Вопрос:

Основываясь на некоторых из приведенных предложений, я отредактировал код, чтобы показать следующее.

 #include <stdio.h>
#include <stdlib.h>

//function declaration
unsigned char float_to_hex(float value);


int main()
{
unsigned char hex_value=0x00;

//variable that stores returned hex value
hex_value = float_to_hex(1.0);
printf("The hex value is %xn", hex_value);

return 0;
}



// Function definition
unsigned char float_to_hex(float value)
{
float atten_float=0.0;
unsigned char atten_hex=0x00;

if( atten_float == 0.0)
{
    atten_hex = 0x00;
    return atten_hex;
}
else if (atten_float== 0.5)
{
  atten_hex = 0x01;
  return atten_hex;


}
else if (atten_float == 1.0)
{
    atten_hex = 0x02;
    return atten_hex;

}
else
{
    atten_hex = 0x00;
    return atten_hex;

}
return -1;

    }
 

Я отредактировал код, инициализировав переменные локально в определении функции. Кроме того, я использую «%x» для печати шестнадцатеричного значения «hex_value», однако я все равно получаю тот же результат, который равен 0.

Ответ №1:

Вы вызвали неопределенное поведение, используя значение нестатической локальной переменной, которая может работать со register спецификатором atten_float . Вы должны инициализировать это до некоторого значения, прежде чем использовать значение в переменной.

Также atten_hex используется без инициализации в atten_float == 0.0 случае. Вы должны добавить туда инициализацию.

Наконец, вы можете использовать %x вместо %c печати шестнадцатеричное значение.

 #include <stdio.h>
#include <stdlib.h>

//function declaration
unsigned char float_to_hex(float value);


int main()
{
    unsigned char hex_value;

    //variable that stores returned hex value
    hex_value = float_to_hex(1.0);
    printf("The hex value is %xn", hex_value); /* use %x instead of %c */

    return 0;
}



// Function definition
unsigned char float_to_hex(float value)
{
    float atten_float = value; /* add initialization */
    unsigned char atten_hex;

    if( atten_float == 0.0)
    {
        atten_hex = 0x42; /* add initialization */
        return atten_hex;
    }
    else if (atten_float== 0.5)
    {
        atten_hex = 0x01;
        return atten_hex;

    }
    else if (atten_float == 1.0)
    {
        atten_hex = 0x02;
        return atten_hex;
    }
    else
    {
        atten_hex = 0x00;
        return atten_hex;
    }
    return -1;

}