首页 > 解决方案 > 输入数字的正确方法是什么?

问题描述

以下程序是否定义良好或会导致未定义的行为?

#include <assert.h>
#include <stdio.h>

int main(void)
{
    float x, y;
    int i;

    assert(sizeof (x) == sizeof (i));
    x = 3.14;
    i = *(int *) &x;
    y = *(float *) &i;
    printf("%f %f\n", x, y);
    return 0;
}

如果它会导致未定义的行为,是否有另一种方法可以在不更改值的位模式的情况下将浮点值的类型更改为整数类型?

编辑:

我要实现的是一个类似于

#define CONV(T, n) ((T) (n))

但这不会改变 n 的位模式。

标签: ccasting

解决方案


float是的,通过int*指针访问数据是未定义的行为(它违反了严格的别名)。

进行类型双关的标准方法是写memcpy(&i, &x, sizeof(i))而不是i = *(int*)&x.

这是一个很好的资源:什么是严格别名以及我们为什么关心


推荐阅读