Я хочу переинтерпретировать данные одного типа как другого переносимым способом (C99). Я не говорю о кастинге, я хочу переинтерпретацию некоторых данных. Кроме того, под переносимым я имею в виду, что он не нарушает правила C99 - я не подразумеваю, что переинтерпретируемое значение одинаково во всех системах.
Я знаю 3 различных способа интерпретации данных, но только два из них переносимы:
Это не переносимо - оно нарушает строгие правила псевдонимов.
/ * # 1 Тип Punning * /
float float_value = 3,14;
int * int_pointer = (int *) & float_value;
int int_value = * int_pointer;
Это зависит от платформы, потому что он считывает значение 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;
Подойдет, если sizeof (int) == sizeof (float)
/ * # 3 Копирование * /
float float_value = 3,14;
int int_value = 0;
memcpy (& int_value, & float_value, sizeof (int_value));
Мои вопросы: