0

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

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

访问问题:

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

注意力:

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

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

4

1 回答 1

7

与往常一样,给任意内存取别名的方法是使用 s 数组unsigned char。时期。所有这些“联合”解决方案都有未定义的行为,因此实际上不是任何“解决方案”。

所以复制到一个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';
}

现场演示

于 2016-06-16T14:01:13.180 回答