十六进制和十进制的 !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
我使用 !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