0

浮動小数点変数が与えられ、そのバイト表現が何であるかを知りたがっていました。そこで私は IDEOne に行き、そのための簡単なプログラムを書きました。しかし、驚いたことに、実行時エラーが発生します。

#include <stdio.h>
#include <assert.h>

int main()
{
    // These are their sizes here. So just to prove it.
    assert(sizeof(char) == 1);
    assert(sizeof(short) == 2);
    assert(sizeof(float) == 4);

    // Little endian
    union {
        short s;
        char c[2];
    } endian;
    endian.s = 0x00FF; // would be stored as FF 00 on little
    assert((char)endian.c[0] == (char)0xFF);
    assert((char)endian.c[1] == (char)0x00);

    union {
        float f;
        char c[4];
    } var;
    var.f = 0.0003401360590942204;
    printf("%x %x %x %x", var.c[3], var.c[2], var.c[1], var.c[0]); // little endian
}

IDEOne では、次のように出力されます。

39 ffffffb2 54 4a

実行時エラーとともに。実行時エラーが発生するのはなぜb2ですかffffffb2? 私の推測では、b2符号拡張です。

4

3 に答える 3

6

charサインタイプです。長さが 8 ビットで、127 より大きい値を入れると、オーバーフローします。符号付き整数のオーバーフローは未定義の動作であるため、符号なしの値を期待する変換指定子を使用して符号付きの値を出力します (%xは期待されますunsigned intが、可変引数関数に渡されるとchar[暗黙的に変換されます] に昇格されます)。signed intprintf()

結論 - に変更char c[4]するunsigned char c[4]と、正常に動作します。

于 2013-07-25T21:02:48.780 に答える
5

を に置き換えchar、最後unsigned charstructを追加するreturn 0;と、すべての問題が修正されます: http://ideone.com/ienG2b

于 2013-07-25T21:03:21.867 に答える
2

あなたのアプローチはあらゆる種類の間違っています。一般的なオブジェクトのバイナリ表現を出力する方法は次のとおりです。

template <typename T>
void hexdump(T const & x)
{
    unsigned char const * p = reinterpret_cast<unsigned char const *>(&x);
    for (std::size_t i = 0; i != sizeof(T); ++i)
    {
        std::printf("%02X", p[i]);
    }
}

結論として、任意のオブジェクトを常に文字配列として解釈できるため、その表現を明らかにすることができます。

于 2013-07-25T21:09:24.433 に答える