Кастинг — Копирование байтов непосредственно из float в unsigned int в C ++ Visual Studio?

Я пытаюсь преобразовать число с плавающей запятой непосредственно в целое число без знака БЕЗ КАКИХ-ЛИБО НЕИЗВЕСТНЫХ МАТЕМАТИЧЕСКОЙ КОНВЕРСИИ (а не в стиле C или статических приведениях), просто копируя байты непосредственно в другой. В Windows Visual Studio 2015 размеры для числа с плавающей запятой и целого числа без знака одинаковы (4 байта), поэтому я не думаю, что в этом есть какая-либо проблема. , , Я нашел решение, но должен быть лучший способ сделать то, что я хочу.

unsigned int x = 3;
float y = 2.4565;
*reinterpret_cast<float*>(&x) = y;

Это делает то, что я хочу, и устанавливает X на 1075656524.

Я бы предпочел кроссплатформенное решение, если оно есть. Я знаю, что размеры типов могут варьироваться от платформы к платформе, так что это может быть невозможно.

РЕДАКТИРОВАТЬ: Чтобы уточнить, я хочу, чтобы все байты с плавающей точкой скопированы в беззнаковый int без изменений. Каждый отдельный бит, хранящийся в float, должен храниться в целом числе без знака. Также есть решение, которое не использует memcpy? Я хочу избежать использования устаревших функций.

0

Решение

Я пытаюсь преобразовать число с плавающей запятой непосредственно в целое число без знака БЕЗ КАКИХ-ЛИБО ВНУТРЕННЕЙ МАТЕМАТЫ КОНВЕРСИИ, (а не в стиле C или статических приведениях), просто копируя байты непосредственно в другой

Кажется, что все, что вы хотите сделать, это скопировать битовый шаблон из одной ячейки памяти в другую. Стандартная функция библиотеки memcpy может быть использовано для этого. Просто поймите, что если sizeof(int) отличается от sizeof(float), Все это спорно.

unsigned int x = 3;
float y = 2.4565;
static_assert(sizeof(int) == sizeof(float), "Can't memcpy a float to an int");
memcpy(&x, &y);

Более переносимым решением будет использование массива uint8_t или же int8_t,

uint8_t x[sizeof(float)];
float y = 2.4565;
memcpy(x, &y);

Теперь вы можете проверить битовую комбинацию, изучив значения элементов массива.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]