Как объединение относится к обращению в этой ситуации?
В C11 вам разрешено использовать union
s для выполнения "наложения типа", что является сутью вашего преобразования здесь: переосмысление битов, связанных с float
, вместо этого как(подписанное, предполагаемое 32-разрядное) целое число.
Почему я должен его использовать?
Вы не должны использовать это.В C ++ это считается неопределенным поведением, и, хотя многие основные компиляторы будут поддерживать готовые штамповки на основе объединения, на них нельзя полагаться, чтобы они всегда обеспечивали это поведение, особенно когда стандартные изменения C ++ вбудущее.
Есть ли какой-нибудь симпатичный способ сделать то же самое, чтобы получить 64-битное представление?
Если ваш компилятор гарантирует наказание на основе объединения, то вам нужно толькозамените его соответствующим 64-битным целым числом:
static_assert(sizeof(double) == sizeof(uint64_t));
union {
double input;
uint64_t output;
} data;
data.input = value;
std::bitset<sizeof(double) * CHAR_BIT> bits(data.output);
Если этого не произойдет, то довольно способа сделать это не будет, но есть способ сделать это, гарантируяопределенное поведение:
static_assert(sizeof(double) == sizeof(uint64_t));
uint64_t output;
double input = value;
memcpy(output, input, sizeof(double));
std::bitset<sizeof(double) * CHAR_BIT> bits(output);