4

私は持っていunsigned char*ます。通常、これはデータのチャンクを指しますが、場合によっては、ポインタがデータです。ポインタ( )にint値をキャストし、その逆も同様です。unsigned char*unsigned char* intData = (unsigned char*)myInteger;

ただし、float値を使用してこれを行う必要があり、変換エラーが発生し続けます。

unsigned char* data;
float myFloat = (float)data;

これどうやってするの?

4

4 に答える 4

4

bit_cast:

template <class Dest, class Source>
inline Dest bit_cast(Source const &source) {
    static_assert(sizeof(Dest)==sizeof(Source), "size of destination and source objects must be equal");
    static_assert(std::is_trivially_copyable<Dest>::value, "destination type must be trivially copyable.");
    static_assert(std::is_trivially_copyable<Source>::value, "source type must be trivially copyable");

    Dest dest;
    std::memcpy(&dest, &source, sizeof(dest));
    return dest;
}

使用法:

char *c = nullptr;
float f = bit_cast<float>(c);
c = bit_cast<char *>(f);
于 2012-09-13T01:10:11.240 に答える
3

特定の変数を使用して他のデータを格納する唯一の正しい方法は、データをバイト単位でコピーすることです。

template <typename T>
void store(unsigned char * & p, T const & val)
{
    static_assert(sizeof(unsigned char *) >= sizeof(T));

    char const * q = reinterpret_cast<char const *>(&val);
    std::copy(q, q + sizeof(T), reinterpret_cast<char *>(&p));
}

使用法:

unsigned char * p;
store(p, 1.5);
store(p, 12UL);

一致する検索機能:

template <typename T>
T load(unsigned char * const & p)
{
    static_assert(sizeof(unsigned char *) >= sizeof(T));

    T val;
    char const * q = reinterpret_cast<char const *>(&p);
    std::copy(q, q + sizeof(T), reinterpret_cast<char *>(&val));

    return val;
}

使用法:

auto f = load<float>(p);
于 2012-09-12T23:37:46.353 に答える
2

コンパイラがそれをサポートしている場合(GCCはサポートしています)、ユニオンを使用します。これは、C++標準による未定義の動作です。

union {
    unsigned char* p;
    float f;
} pun;

pun.p = data;
float myFloat = pun.f;

これは次の場合に機能しsizeof(unsigned char *) == sizeof(float)ます。ポインタがフロートよりも大きい場合は、戦略を再考する必要があります。

型のパンニングに関するウィキペディアの記事、特にユニオンの使用に関するセクションを参照してください。

GCCは、ユニオンを直接使用し、ユニオンに型キャストしない限り、ユニオンを使用した型のパンニングを許可します...型のパンニングにGCCを使用する正しい方法と誤った方法については、型のパンニングの問題に関するこのIBMの説明を参照してください。

強い型と弱い型に関するウィキペディアの記事と、型のパンニングと厳密なエイリアシングに関するよく研究された記事も参照してください。

于 2012-09-13T01:35:45.097 に答える
-1
unsigned char* data;
float myFloat = *(float*)data;
于 2012-09-12T23:32:16.983 に答える