Я должен напечатать двоичное представление long double
номер по ряду причин. Я хочу видеть точный формат, который остается в памяти компьютера.
Я прошел следующие вопросы, где принимая union
было решение. За float
альтернативный тип данных был unsigned int
так как оба 32-битные. За double
, это было unsigned long int
поскольку оба являются 64-битными. Но из long double
Это 96-битный / 128-битный (в зависимости от платформы), который не имеет аналогичного эквивалентного потребителя памяти. Итак, каково будет решение?
Помечено как дубликат вопроса Как напечатать (используя cout) способ хранения числа в памяти? !
Это правда? В упомянутом вопросе говорилось о целом числе, и было принято решение о его bitset
который просто усекает часть с плавающей точкой. Моя основная точка зрения — представление с плавающей точкой, которое не имеет отношения к содержанию этого вопроса.
Как всегда, путь к псевдониму произвольной памяти с помощью массива unsigned char
s. Период. Все эти «объединенные» решения имеют неопределенное поведение и, таким образом, фактически не являются «решениями» вообще.
Так скопируйте в 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';
}
Других решений пока нет …