Я хочу переинтерпретировать данные одного типа как другого типа переносимым способом (C99). Я не говорю о кастинге, я хочу переосмыслить некоторые данные. Кроме того, переносимым я имею в виду, что он не нарушает правила C99 - я не имею в виду, что переопределенное значение равно для всех систем.
Я знаю 3 разных способа переинтерпретировать данные, но только два из них переносимы:
-
Это не переносимо - это нарушает правило строгого сглаживания.
/* #1 Type Punning */ float float_value = 3.14; int *int_pointer = (int *)&float_value; int int_value = *int_pointer; -
Это зависит от платформы, потому что он считывает значение
intиз объединения после записиfloatв него. Но он не нарушает правил C99, поэтому он должен работать (еслиsizeof(int) == sizeof(float))./* #2 Union Punning */ union data { float float_value; int int_value; }; union data data_value; data_value.float_value = 3.14; int int_value = data_value.int_value; -
Должно быть хорошо, если
sizeof(int) == sizeof(float)/* #3 Copying */ float float_value = 3.14; int int_value = 0; memcpy(&int_value, &float_value, sizeof(int_value));
Мои вопросы:
- Правильно ли это?
- Знаете ли вы другие способы переинтерпретации данных переносимым образом?