0

long double何らかの理由で、数値のバイナリ表現を出力する必要があります。コンピューターのメモリに残っている正確な形式を確認したい。

私は次の質問に答えましたunion。の場合float、代替データ型はunsigned int両方とも 32 ビットでした。についてdoubleunsigned long int、両方とも 64 ビットでした。しかし oflong doubleでは、96 ビット/128 ビット (プラットフォームによって異なります) であり、同様の同等のメモリ コンシューマーはありません。それで、解決策は何でしょうか?

訪問した質問:

  1. C++ で浮動小数点数のバイナリ表現を出力します
  2. double のバイナリ表現
  3. double の正確なバイナリ表現
  4. float または double のバイナリ表現を表示するにはどうすればよいですか?

注意:

これは、数値がメモリに保存されている方法を (cout を使用して) 印刷するにはどうすればよいですか?という質問の重複としてマークされています。!

本当にそうですか?質問で言及された質問は、整数について話し、その解決策として受け入れbitsetられたのは、浮動小数点部分を切り捨てることでした。私の主な見解は、その質問の内容とは関係のない浮動小数点表現です。

4

1 に答える 1

7

いつものように、任意のメモリをエイリアスする方法は、unsigned chars の配列を使用することです。限目。これらの「結合」ソリューションはすべて未定義の動作をするため、実際には「ソリューション」ではありません。

したがって、配列にコピーしてunsigned charから、バイト値を1つずつ出力します。

ちなみにlong double96ビットとは限りません。プラットフォームによって異なります。

#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 に答える