十六进制和十进制的 !objsize 不一致

Discrepancy in !objsize in hex and decimal

我使用 !objsize 命令来获取对象的真实值。例如,当我 运行 下面的命令时,它告诉我地址​​ 00000003a275f218 处的对象大小为 18 十六进制,转换为十进制的 24。

0:000> !ObjSize 00000003a275f218 
sizeof(00000003a275f218) = 24 (0x18) bytes 

到目前为止一切顺利。我在一个对象上 运行ning 相同的命令,它的大小似乎在十六进制和十进制之间存在差异。

所以十六进制的大小是 0xafbde200。当我使用我的计算器将它转换为十进制时,它变为 2948456960 而命令的输出显示十进制大小为 -1346510336。谁能帮我理解为什么尺寸不同?

区别在于符号。它似乎将第一位(这是 1,因为第一个十六进制字节是 "A")解释为负号。这两个数字在其他方面是相同的。

粘贴-1346510336到calc.exe(程序员模式),切换到十六进制:

FFFFFFFFAFBDE200

粘贴2948456960,切换为十六进制:

AFBDE200

这是 SOS 中的一个错误。如果您查看 source code,您会发现声明为

的方法
DECLARE_API(ObjSize)

它使用以下格式作为输出

ExtOut("sizeof(%p) = %d (0x%x) bytes (%S)\n", SOS_PTR(obj), size, size, methodTable.GetName());

如您所见,它使用 %d 作为格式说明符,用于有符号的十进制整数。对于无符号十进制整数,这应该是 %u,因为显然你不能让对象使用负内存量。

如果你知道如何使用Git,你可以提供一个补丁。

可以在WinDbg中使用?查看无符号值:

0:000> ? 0xafbde200
Evaluate expression: 2948456960 = 00000000`afbde200