如何在C中将unsigned long long转换为float / int?

时间:2020-03-02 14:16:22

标签: c casting type-conversion long-integer unsigned-long-long-int

一个无符号的long long变量,其值为十六进制的“ 40 36 70 A3 D7 0A 3D 71”。如果使用%f转换说明符进行打印,则可以从IEEE-754获得正确的转换。即使丢失了一些小数,如何将这个变量转换为浮点数或int

我尝试过强制转换,但它给我带来不好的价值。此处的示例:

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

1 个答案:

答案 0 :(得分:1)

假设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);

请注意,如果整数中的值与系统上的有效双精度浮点值具有相同的位模式,则这仅在内有效。否则可能导致不确定的行为


现在,如果要将其转换为int22(因为0x403670A3D70A3D71double22.44的二进制表示),则您首先需要使用类型校正来获取浮点值,然后使用floor函数将其截断为整数值(但仍为浮点类型),最后将其强制转换为{{1} }:

int