私は32ビットアドレスを持っています
uint32_t ptrToValue;
そして、このメモリの場所から 64 ビットの値を取得したいと考えています。
私がこのようにすれば
uint64_t value = *(uint64_t*) ptrToValue;
「異なる整数サイズのポインターを作成します」という警告が表示されます
どうすればそれを処理できますか?
私は32ビットアドレスを持っています
uint32_t ptrToValue;
そして、このメモリの場所から 64 ビットの値を取得したいと考えています。
私がこのようにすれば
uint64_t value = *(uint64_t*) ptrToValue;
「異なる整数サイズのポインターを作成します」という警告が表示されます
どうすればそれを処理できますか?
適切なサイズの整数型を使用してください: intptr_t
. これは、ポインターとの間で変換可能であることが保証されている整数型です。
私は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]