биты с плавающей запятой и строгое алиасинг

я пытаюсь извлечь биты из числа с плавающей запятой, не вызывая неопределенного поведения. Вот моя первая попытка:

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 на инкрементальную сборку?

Заранее спасибо

14
задан Alex 1 December 2010 в 19:40
поделиться