Как правильно набрать число? - PullRequest
0 голосов
/ 01 марта 2020

Правильно ли определена следующая программа или она может вызвать неопределенное поведение?

#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.

1 Ответ

3 голосов
/ 01 марта 2020

Да, это неопределенное поведение для доступа к float данным через указатель int* (это нарушает строгое псевдонимы).

Стандартный способ сделать типизацию - писать memcpy(&i, &x, sizeof(i)) вместо i = *(int*)&x.

Это хороший ресурс: Что такое строгое искажение и почему мы заботимся

...