Присвоение и получение значений объединения, ввод слов

У меня есть союз, хорошо.
Этот союз находится внутри структуры, и этот союз безымянный (что-то вроде этого).

typedef enum TYPES {INT, FLOAT, CHAR, POINTER TO FUNCTION /* Please pay attention on this */};

typedef struct {
    TYPES type;
    union {
        int integer;
        float real;
        char letter;
        char *string;
        /* here we have a pointer to function syntax but I don't remember how to write it right now*/
    }
} MY_STRUCT;

Я инициализирую свою структуру таким образом.

MY_STRUCT test = {INT, 22};

Хорошо, я знаю, что это работает, потому что по определению, когда я использую этот тип инициализации, будет использоваться самое первое поле объединения.
Итак, вопрос:
что произойдет, если я напишу инициализацию таким образом?

MY_STRUCT test = {INT, 22.2};

После того, как я попытаюсь получить значение с плавающей запятой, я получу правильное значение?

float var = (float)test.real;

Будет ли это показывать правильные вещи?
Будет ли это работать для каждого типа? Даже указатель на функцию один?

Я спрашиваю об этом, потому что по определению эта инициализация помещает значение в самое первое поле моего объединения, поэтому есть ли проблема, если float больше, чем int? Я этого не знаю, поэтому я знаю об указателе на функцию, что иногда он может быть больше, чем int, поэтому мне нужно написать свой союз с указателем, чтобы он функционировал как самый первый член?

Я читал, что GCC поддерживает каламбуры типов, и даже ядро ​​Linux использует каламбуры типов. Поэтому я боюсь только того, смогу ли я использовать такую ​​​​инициализацию в этой структуре и после этого получить правильные значения.


person drigoSkalWalker    schedule 19.04.2013    source источник


Ответы (1)


Элементы объединения делят пространство памяти, весь союз использует пространство, необходимое для «самого большого» элемента. Когда вы инициализируете 22.2 . Это соответствует 01000001101100011001100110011010 с использованием fpoint IEEE 754. Это зависит от точности. и ваш

float var=(float) test.real

будет работать, только если вы не измените ни одного элемента объединения между инициализацией и этой строкой.

person RockLegend    schedule 06.12.2013