3

C++ コード (Visual Studio は devenv /useenv (x64) で開始され、isWOW64 は false)

DWORD64 check;

check = -1;
printf("value %u", check);

値4294967295、つまり0x(32)fを出力します。これは、x32環境で単純なDWORDを使用して実行した場合と同じです

はい、私は DWORD64 が unsigned __int64 であることを知っていますが、それは 0x(64)f であってはなりませんか?

アセンブラはそこで何をしましたか? コードを逆アセンブルしてもあまり役に立ちませんでした。

4

3 に答える 3

8

ここでの問題は、printfフォーマット文字列にあります。%utellを使用しprintfて 32 ビット値を出力します。したがって、それはあなたの最初の 32 ビットのみを使用しますDWORD64。スタックにプッシュされたすべての 64 ビットを出力するには、%llu(for unsigned long long) を使用します。

DWORD64できないことにも注意してくださいunsigned long。すべての Windows バージョンは、Windows 64 ビットであってもlong32 ビットです。

LLP64 モデルを参照してください。

于 2012-06-20T06:43:56.940 に答える
3

マニュアルページを見ると、%uフォーマット仕様は typeintです。これはprintf、 が値を として読み取ることを意味します。これはint、64 ビット プラットフォームでも 32 ビットのままです。

またはのいずれかのサイズ仕様を追加すると、形式は になります。llI64%I64u

于 2012-06-20T06:47:39.327 に答える
2

32ビットintとして格納されているため-1LLです-1

于 2012-06-20T06:47:24.297 に答える