Я хочу переинтерпретировать данные одного типа как другого типа переносимым способом (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));
Мои вопросы:
- Это правильно?
- Знаете ли вы другие способы интерпретировать данные переносимо?
float
в памяти. - person Magnus Hoff   schedule 15.12.2011