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

How to convert unsigned long long to float/int in C?

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

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

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

假设 unsigned long long 变量包含一个有效的 double 值,那么您可以使用 双关语 ,例如使用联合:

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

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

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


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

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