Я знаю, что нарушение строгого правила псевдонимов является неопределенным поведением в соответствии со стандартом C. Пожалуйста, не говорите мне, что это УБ и тут не о чем говорить.
Я хотел бы знать, есть ли компиляторы, которые не будут иметь ожидаемого поведения (определенного мной ниже) для следующего кода.
Предположим, что размер float
и int
составляет 4 байта, и это машина с прямым порядком байтов.
float f = 1234.567; /* Any value here */
unsigned int u = *(unsigned int *)&f;
Мое ожидаемое поведение в английских словах: «получить четыре байта, где хранится float
, и поместить их в int
как есть». В коде было бы так (думаю тут нет УБ):
float f = 1234.567; /* Any value here */
unsigned char *p = (unsigned char *)&f;
unsigned int u = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
Я также приветствовал бы практические и конкретные примеры того, почему, помимо UB в соответствии со стандартом, компилятор может иметь то, что я считаю неожиданным поведением.
memcpy
не будет правильным ответом? - person fukanchik   schedule 23.04.2016