я пытаюсь извлечь биты из числа с плавающей запятой, не вызывая неопределенного поведения. Вот моя первая попытка:
unsigned foo(float x)
{
unsigned* u = (unsigned*)&x;
return *u;
}
Насколько я понимаю, это не гарантирует работу из-за строгих правил псевдонима, верно? Сработает ли, если я сделаю промежуточный шаг с помощью указателя на символ?
unsigned bar(float x)
{
char* c = (char*)&x;
unsigned* u = (unsigned*)c;
return *u;
}
Или мне придется самому извлекать отдельные байты?
unsigned baz(float x)
{
unsigned char* c = (unsigned char*)&x;
return c[0] | c[1] << 8 | c[2] << 16 | c[3] << 24;
}
Конечно, это имеет тот недостаток, что зависит от порядка байтов, но я мог бы смириться с этим.
Взлом union - определенно неопределенное поведение, не так ли?
unsigned uni(float x)
{
union { float f; unsigned u; };
f = x;
return u;
}
Для полноты, вот справочная версия foo
. Также неопределенное поведение, верно?
unsigned ref(float x)
{
return (unsigned&)x;
}
Итак, можно ли извлечь биты из числа с плавающей запятой ( при условии, что оба имеют ширину 32 бита , конечно)?
РЕДАКТИРОВАТЬ: А вот ] memcpy
версия, предложенная Гозом.
Он компилируется и работает, пока все хорошо. К сожалению, каждый раз, когда я что-то изменяю в структуре моей родной…
В настоящее время я работаю над большим Android-приложением, использующим огромное количество кода C ++. Он компилируется и запускается, пока все хорошо.
К сожалению, каждый раз, когда я изменяю что-то в структуре моего исходного кода (добавляю / удаляю / переименовываю / перемещаю файл), что случается довольно часто, ndk-build восстанавливает весь исходный код, даже нетронутые файлы.
Кто-нибудь знает, как я могу настроить Android NDK на инкрементальную сборку?
Заранее спасибо