如何在C中将无符号long-long转换为float/int



无符号长-长变量的值为十六进制的"40 36 70 A3 D7 0A 3D 71"。如果我使用%f转换说明符打印它,我将从IEEE-754获得正确的转换。即使我丢失了一些小数,我如何将此变量强制转换为浮动1或int

我试过选它,但它给了我不好的价值观。此处示例:

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

假设unsigned long long变量包含一个有效的double值,则可以使用类型punning,例如使用unions:

union
{
unsigned long long i;
double             f;
} value = { .i = 0x403670A3D70A3D71 };
printf("0x%llx is %fn", value.i, value.f);

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


现在,如果您想将其转换为int22(因为0x403670A3D70A3D71double22.44的二进制表示(,那么您首先需要使用类型punning来获得浮点值,然后使用floor函数将其截断为整数值(但仍为浮点类型(,最后将其转换成int:

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

最新更新