Я хочу переинтерпретировать данные одного типа как другого типа переносимым способом (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));
Мои вопросы:
- Правильно ли это?
- Знаете ли вы другие способы переинтерпретации данных переносимым образом?