Метод объединения, который вы предложили, - это обычный маршрут, по которому идет большинство людей. Тем не менее, технически неопределенное поведение в C / C ++ заключается в чтении другого члена из объединения, чем тот, который был написан совсем недавно. Несмотря на это, он хорошо поддерживается практически всеми компиляторами.
Приведение указателей, как предложил Джон Скит , является плохой идеей - она нарушает правила строгого псевдонима языка C. Агрессивный оптимизирующий компилятор выдаст для этого неправильный код, поскольку предполагается, что указатели типов unsigned long *
и float *
никогда не будут псевдонимами друг друга.
Наиболее правильный способ с точки зрения соответствия стандартам (то есть, не вызывая неопределенное поведение) - это приведение через char*
, поскольку строгие правила псевдонимов разрешают указатель char*
на псевдоним указателя любого другого Тип:
unsigned long ul = 0x40A00000;
float f;
char *pul = (char *)&ul; // ok, char* can alias any type
char *pf = (char *)&f; // ok, char* can alias any type
memcpy(pf, pul, sizeof(float));
Хотя, честно говоря, я бы просто использовал метод объединения. Из ссылки на cellperformance.com выше:
Это очень распространенная идиома, которая хорошо поддерживается всеми основными компиляторами. На практике чтение и письмо любому члену профсоюза в любом порядке является приемлемой практикой.