3

C++ 代码(Visual Studio 以 devenv /useenv (x64) 开头,isWOW64 为假)

DWORD64 check;

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

它打印值 4294967295 即 0x(32)f 如果我在 x32 环境中使用简单的 DWORD 执行此操作,则它是相同的

是的,我知道 DWORD64 是无符号的 __int64,但它不应该是 0x(64)f 吗?

装配工在那里做了什么?反汇编代码对我没有多大帮助。

4

3 回答 3

8

您的问题在于printf格式字符串。使用%utellprintf打印 32 位值。因此,它仅使用DWORD64. 要打印已压入堆栈的所有 64 位,请使用%llu(for unsigned long long)。

另请注意,DWORD64不能unsigned long。在所有 Windows 版本上,即使在 Windows 64 位上,long也是 32 位。

参见LLP64 模型

于 2012-06-20T06:43:56.940 回答
3

如果您查看手册页%u格式规范是 type int。这意味着printf将值读取为int,即使在 64 位平台上仍然是 32 位。

添加一个或的大小规范llI64因此格式将是%I64u.

于 2012-06-20T06:47:39.327 回答
2

应该是-1LL因为-1存储为 32bit int

于 2012-06-20T06:47:24.297 回答