Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Не знал, что преобразование int* во float* неопределено.Отлично оно определено, не надо наездов! Другое дело, что перед использованием нужно обратно из float* в Int* преобразовать.
Ну и зачем тогда оно такое нужно? Проще считать что оно не определено само по себе, меньше wtfpm в коде будет.
Ну и зачем тогда оно такое нужно?А зачем, скажем,
void* нужен? Для тех же целей можно и int* использовать. Например если у вас функция принимает int* и потом передаёт его в callback — то можно передать указатель на float*, сконвертировав его в нужный тип — а потом сконвертировать обратно.Думаю, подразумевалось следующее:
int a = 1;
float b;
int *pa = &a;
float *pb = &b;
memcpy(pb, pa, sizeof(a));int i = 1;
float res;
memcpy(&res, &i, sizeof i);Результат этой операции: (float*)pa; не определён в соответствии со стандартом.На самом деле определён. Не определено разименование этого указателя.
int читайте int. Записали float — читайте тоже float.floatами выполняется отдельным [со]процессором (а когда-то так и было — что 68881, что 8087 — это отдельные железки) и он работает параллельно с основным процессором. Соответственно если мы не вставим явную инструкцию синхронизации никто вам не гарантирует, что данные, которые вы хотите прочитать уже будут готовы к тому моменту, когда вы соберёсь их читать.Для беззнаковых переменных ничего не стоит гарантировать переполнение по модулю 2 (заворачивание)
It is worth noting that unsigned overflow is guaranteed ...— «стоит отметить, что беззнаковое переполнение гарантировано...»
Что каждый программист на C должен знать об Undefined Behavior. Часть 1/3