1

私は退屈で、double のバイナリ表現がどのように見えるかを見たいと思っていました。しかし、Windows で奇妙なことに気付きました。次のコード行は、

double number = 1;
unsigned long num = *(unsigned long *) &number;
cout << num << endl;

私の Macbook では、これによりゼロ以外の数値が得られます。私のWindowsマシンでは、0になります。

double としての 1.0 のバイナリ表現はすべてゼロであってはならないため、ゼロ以外の数値が返されることを期待していました。ただし、私がやろうとしていることが明確に定義された動作であるかどうかはよくわかりません。

私の質問は、上記のコードは愚かで間違っているのでしょうか? また、double のバイナリ表現を出力する方法はありますか?

ありがとう。

4

2 に答える 2

5

1ダブルは3ff0 0000 0000 0000long4 バイトの intです。リトルエンディアンのハードウェアでは、その0000 0000部分を読んでいます。

于 2013-02-25T22:07:33.437 に答える
2

コンパイラがサポートしている場合 (GCC がサポートしている場合)、共用体を使用します。これは、C++ 標準 (厳格なエイリアシング規則) によると未定義の動作です。

#include <iostream>
int main() {
    union {
        unsigned long long num;
        double fp;
    } pun;

    pun.fp = 1.0;
    std::cout << std::hex << pun.num << std::endl;
}

出力は

3ff0000000000000
于 2013-02-25T22:17:00.703 に答える