Как распечатать двоичное представление длинного двойника как в компьютерной памяти?

Я должен напечатать двоичное представление long double номер по ряду причин. Я хочу видеть точный формат, который остается в памяти компьютера.

Я прошел следующие вопросы, где принимая union было решение. За floatальтернативный тип данных был unsigned int так как оба 32-битные. За double, это было unsigned long int поскольку оба являются 64-битными. Но из long doubleЭто 96-битный / 128-битный (в зависимости от платформы), который не имеет аналогичного эквивалентного потребителя памяти. Итак, каково будет решение?

Посещенные вопросы:

  1. Вывести двоичное представление числа с плавающей точкой в ​​C ++
  2. Бинарное представление двойного
  3. Точное двоичное представление двойного
  4. Как мне отобразить двоичное представление с плавающей или двойной?

ВНИМАНИЕ:

Помечено как дубликат вопроса Как напечатать (используя cout) способ хранения числа в памяти? !

Это правда? В упомянутом вопросе говорилось о целом числе, и было принято решение о его bitset который просто усекает часть с плавающей точкой. Моя основная точка зрения — представление с плавающей точкой, которое не имеет отношения к содержанию этого вопроса.

-1

Решение

Как всегда, путь к псевдониму произвольной памяти с помощью массива unsigned chars. Период. Все эти «объединенные» решения имеют неопределенное поведение и, таким образом, фактически не являются «решениями» вообще.

Так скопируйте в unsigned char массив, а затем просто распечатать байтовые значения по одному.

Между прочим, long double не обязательно 96-битный. Это будет зависеть от платформы.

#include <iostream>
#include <algorithm>

int main()
{
const long double x = 42;
unsigned char     a[sizeof(long double)];

std::copy(
reinterpret_cast<const unsigned char*>(&x),
reinterpret_cast<const unsigned char*>(&x) + sizeof(long double),
&a[0]
);

std::cout << "Bytes: " << sizeof(long double) << "\nValues: ";
std::cout << std::hex << std::showbase;
for (auto el : a) {
std::cout << +el << ' ';
}

std::cout << '\n';
}

(живое демо)

7

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

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

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