Переинтерпретация переносимых данных

Я хочу переинтерпретировать данные одного типа как другого переносимым способом (C99). Я не говорю о кастинге, я хочу переинтерпретацию некоторых данных. Кроме того, под переносимым я имею в виду, что он не нарушает правила C99 - я не подразумеваю, что переинтерпретируемое значение одинаково во всех системах.

Я знаю 3 различных способа интерпретации данных, но только два из них переносимы:

  1. Это не переносимо - оно нарушает строгие правила псевдонимов.

     / * # 1 Тип Punning * /
    float float_value = 3,14;
    int * int_pointer = (int *) & float_value;
    int int_value = * int_pointer;
    
  2. Это зависит от платформы, потому что он считывает значение int из объединения после записи в него float .Но он не нарушает никаких правил C99, поэтому он должен работать (if sizeof (int) == sizeof (float) ).

     / * # 2 Union Punning * /
    union data {
    float float_value;
    int int_value;
    };
    объединение данных data_value;
    data_value.float_value = 3,14;
    int int_value = data_value.int_value;
    
  3. Подойдет, если sizeof (int) == sizeof (float)

     / * # 3 Копирование * /
    float float_value = 3,14;
    int int_value = 0;
    memcpy (& int_value, & float_value, sizeof (int_value));
    

Мои вопросы:

  1. Это правильно?
  2. Знаете ли вы другие способы переинтерпретации данных переносимым способом?
14
задан Flexo 6 May 2012 в 13:43
поделиться