如何在计算机内存中打印long double的二进制表示?

Ena*_*san -1 c++ floating-point binary long-double

long double出于某些原因,我必须打印数字的二进制表示.我想看到它保留在计算机内存中的确切格式.

我经历了以下问题,其中一个union是解决方案.因为float,备用数据类型unsigned int都是32位.因为double,unsigned long int两者都是64位.但是long double,它是96位/ 128位(取决于平台),它没有类似的等效内存消费者.那么,解决方案是什么?

访问量问题:

  1. 用C++打印浮点数的二进制表示
  2. 二进制的二进制表示
  3. 双精确二进制表示
  4. 如何显示float或double的二进制表示?

注意:

它被标记为问题的副本如何打印(使用cout)数字存储在内存中的方式?!

真的是吗?提到的问题是关于整数的问题和接受的解决方案,它bitset只是截断了浮点部分.我的主要观点是浮点表示,它与该问题的内容无关.

Lig*_*ica 7

与往常一样,别名任意内存的方法是使用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';
}
Run Code Online (Sandbox Code Playgroud)

(现场演示)