Как конвертировать unsigned long long в float / int в C? - PullRequest
0 голосов
/ 02 марта 2020

Переменная long без знака имеет значение "40 36 70 A3 D7 0A 3D 71" в шестнадцатеричном формате. Если я распечатаю его со спецификатором преобразования %f, я получу правильное преобразование из IEEE-754. Как я могу привести эту переменную к плавающей или int, даже если я потеряю несколько десятичных дробей?

Я пытался привести ее, но она дает мне неправильные значения. Пример здесь:

unsigned long long hex = 0x403670A3D70A3D71;
float cast_float = (float)hex;

1 Ответ

1 голос
/ 02 марта 2020

Предполагая, что переменная unsigned long long содержит значение, которое является допустимым значением double, вы можете использовать type punning , например, с помощью союзов:

union
{
    unsigned long long i;
    double             f;
} value = { .i = 0x403670A3D70A3D71 };

printf("0x%llx is %f\n", value.i, value.f);

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


Теперь, если вы хотите преобразовать его в значение int 22 (поскольку 0x403670A3D70A3D71 является двоичным представлением double value 22.44), затем вам сначала нужно использовать type-punning для получения значения с плавающей запятой, а затем использовать функцию floor, чтобы усечь его до целочисленного значения (но все еще в плавающем тип точки) и, наконец, приведите это к int:

int int_val = (int) floor(value.f);
...