出于某些原因,我必须打印long double
号码的二进制表示。我希望看到它保留在计算机内存中的确切格式。
我经历了以下问题,其中union
是解决方案。对于float
,备用数据类型为unsigned int
,因为它们都是32位。对于double
,它是unsigned long int
,因为它们都是64位。但在long double
中,它是96位/ 128位(取决于平台),它没有类似的等效内存消费者。那么,解决方案是什么?
它被标记为问题How to print (using cout) the way a number is stored in memory?的副本!
真的吗?提到问题的问题是关于整数,并且接受的解决方案是bitset
,它只是截断了浮点部分。我的主要观点是浮点表示,与该问题的内容无关。
答案 0 :(得分:7)
与往常一样,别名任意内存的方法是使用unsigned char
s数组。期。所有这些" union"解决方案具有不确定的行为,因此实际上不是解决方案"任何。
因此,复制到long double
数组中,然后逐个打印出字节值。
顺便说一下,#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';
}
不一定是96位。它取决于平台。
_\d\d