通过位复制进行类型转换

时间:2011-12-09 04:46:53

标签: c

我想将float作为int进行类型转换。但是,这并没有做一点一点的复制。是否可以在保留所有位(符号,指数,尾数)的同时将float强制转换为int

3 个答案:

答案 0 :(得分:4)

不可能以完全符合C标准的方式执行此操作,但您可以使用工会:

union{
    int i;
    float f;
} u;

u.f = 123.456;  //  Your value.

//  Read u.i.

今天几乎所有系统都应该可以使用它。当然,假设floatint的大小相同。

替代方法是使用指针转换,但严格来说,这违反了严格别名并被视为未定义的行为。


另一种(可能是合规的 - 见评论)方法是使用memcpy()

int i;
float f;

f = 123.456;  //  Your value.

memcpy(&i, &f, sizeof(int));

//  Read i

答案 1 :(得分:3)

大多数语言允许这样的东西,在C中它就像:

float f = 3.14f;
int i = *(int*)&f;

答案 2 :(得分:2)

您可以使用union

union
{
    int tmp;
    float f;
} u;

u.f = z;

然后u.tmp是相同的位。 (代码取自this Wikipedia article)。