-1

2つのランダムな32ビット浮動小数点数aとbを生成し、それらを分割して出力cを作成するスクリプトがあります。

これらの3つの浮動小数点数すべてを、8文字を含む文字列として16進形式で格納したいと思います。

私はここでこれをオンラインで行う賢い方法を見つけました:

http://forums.devshed.com/c-programming-42/printing-a-float-as-a-hex-number-567826.html

そして、これがC++での彼らのアドバイスの私の実装です

    fileout << hex << *(int*)&a[i] << endl;
    fileout << hex << *(int*)&b[i] << endl;
    fileout << hex << *(int*)&c[i] << endl;

これはほとんどの場合に機能します。ただし、場合によっては、文字列の幅が8文字ではありません。たまに1ビットしかないこともあります。出力のサンプルは次のとおりです。

                            af1fe786
                    ffbbff0b
                    fffbff0b
                    7fbcbf00  <-I like it, but has zeros at the end 
                    77fefe77
                    7ffcbf00
                    fdad974d
                    f2fc7fef
                    4a2fff56
                    67de7744
                    fdf7711b
                    a9662905
                    cd7adf0   <-- problem
                    5f79ffc0
                    0         <--- problem
                    6ebbc784
                    cffffb83
                    de3bcacf
                    e7b3de77
                    ec7f660b
                    3ab44ae4
                    aefdef82
                    fffa9fd6
                    fd1ff7d2
                    62f4      <--why not "62f40000"
                    ebbf0fa6
                    ddd78b8d
                    4d62ebb3
                    ff5bbceb
                    3dfc3f61
                    ff800000 <- zeros at end, but still 8 bytes?
                    df35b371
                    e0ff7bf1
                    3db6115d
                    fbbfbccc
                    ddf69e06
                    5d470843
                    a3bdae71
                    fe3fff66
                    0         <--problem
                    979e5ba1
                    febbe3b9
                    0         <-problem
                    fdf73a80
                    efcf77a7
                    4d9887fd
                    cafdfb07
                    bf7f3f35
                    4afebadd
                    bffdee35
                    efb79f7f
                    fb1028c   <--problem

8文字の表現が必要です。ゼロの場合は「00000000」に変換したいです。

しかし、4、5、6、7文字しかないものについては本当に混乱しています。一部の数値が最後にゼロで埋められ、他の数値が切り捨てられるのはなぜですか?intが32ビットの場合、なぜ1ビットしか表示されないことがありますか?これは悪名高い「非正規化数」によるものですか?

ありがとう。

4

3 に答える 3

7

要件を正しく理解している場合、桁数が8未満の場合は、16進表現の左側に塗りつぶし文字としてゼロを追加する必要があります。

その場合、ストリームマニピュレータを使用するだけstd::setfill()ですstd::setw()

#include <iomanip> // Necessary for the setw and setfill

int n = ...;
std::cout << std::hex << std::setw(8) << std::setfill('0') << n;

たとえばn = 1024、の場合、出力は次のようになります。

00000400    
于 2013-02-16T10:12:24.817 に答える
0

使用std::setw()std::setfill()

fileout << hex << setw(8) << setfill('0') << *(int*)&a[i] << endl;
fileout << hex << setw(8) << setfill('0') << *(int*)&b[i] << endl;
fileout << hex << setw(8) << setfill('0') << *(int*)&c[i] << endl;
于 2013-02-16T10:12:40.603 に答える
-2

賢さを忘れてください(それは何でもありません)。チェックアウトしsetwsetfill

于 2013-02-16T10:12:36.667 に答える