1

プログラミング言語: C

低と高の 2 つの DWORD があります。両方を size_t 型の 1 つの変数に変換したいと考えています。次のコードがあります。

size_t fileSize = fileSizeHigh;
size_t *pfileSize = &fileSize;
pfileSize[4] = fileSizeLow;

その通りですか?最初のコマンドはおそらく上位バイトを間違った位置に格納するので、そうではないと思いますよね? これを行う方法について私を助けてください。ありがとうございました :)

4

2 に答える 2

2

したがって、32ビットのMicrosoftシステムでは、aDWORDは。と同じサイズsize_tです。DWORDこれは、が占めるスペースに2を収めることができないことを意味しますsize_t

あなたのコードは単に終わりを超えてメモリに書き込み、fileSize未定義の振る舞いをします。それはあなたが望むことをしません。

あなたが実際に達成しようとしていることは何ですか?あなたが完了しようとしているタスクは何ですか?そのことを教えてください。別の解決策を提供できる場合があります。

編集:@nosが説明しているように、64ビットシステムでは、asize_tは2つのを保持できますDWORD。64ビットシステムを使用している場合は、ビットシフトを使用して2つを組み合わせることができます。

size_t combined = ((size_t)high << 32) | (size_t)low; // 64-BIT WINDOWS ONLY

ただし、64ビットのWindowsターゲットでの操作は32ビットのターゲットでの操作と非常に似ているため、これはまだ少しコードの臭いです。したがって、奇妙な理由で何かをしているように見えます。

于 2012-08-03T19:09:51.450 に答える
1

64 ビット コードを記述している場合、size_t は通常 64 ビットです。プラットフォームでこれを確認する必要があります。DWORD は通常 32 ビットなので、それも確認する必要があります。32 ビットの DWORD と 64 ビットの size_t を指定すると、次のようになります。

DWORD a = ...;
DWORD b = ...;
size_t c = (size_t)a << 32 | b;

32 ビット コードを記述している場合、2 つの 32 ビット型を別の 32 ビット型に結合しても意味がありません。size_t は通常、32 ビット コードの 32 ビットです。

于 2012-08-03T19:13:06.677 に答える