3

私は32ビットアドレスを持っています

uint32_t ptrToValue;

そして、このメモリの場所から 64 ビットの値を取得したいと考えています。

私がこのようにすれば

uint64_t value = *(uint64_t*) ptrToValue;

「異なる整数サイズのポインターを作成します」という警告が表示されます

どうすればそれを処理できますか?

4

2 に答える 2

3

適切なサイズの整数型を使用してください: intptr_t. これは、ポインターとの間で変換可能であることが保証されている整数型です。

于 2013-03-07T08:13:01.587 に答える
1

私は32ビットアドレスを持っています

おそらく、32 ビット (4 バイト) のメモリへのポインターがあることを意味します。

uint32_t ptrToValue;

これのことですか?:

uint32_t* ptrToValue;

その * を追加すると、警告が消えるはずです。

jogojapan がコメントで言及しているように、これはアライメントの問題を無視しているため、説明させてください。

結合された 64 ビット値が 64 ビット境界 (8 で割り切れるバイト アドレス) にある場合、ポインターをキャストして 64 ビットを一度に読み書きする場合は問題ありません。しかし、そうでなく、あなたのマシンが不整列アクセスをサポートしていない場合、悪いことが起こります (つまり、プログラムのクラッシュ)。

コードを任意のマシン (少なくとも一度に 64 ビットを格納できるマシン) で動作させたい場合は、共用体を使用する必要があります。

typedef union {
    uint32_t b32[2];
    uint64_t b64[1];
} bits64;

次に、タイプの変数を宣言し、それを 32 ビット値または 64 ビット値として解釈するかどうかに応じてandまたはbytes8を使用できます。b32[0]b32[1]b64[0]

于 2013-03-07T08:27:36.097 に答える