Debugging Tools for Windows

符号扩展

当一个 32 位整数为负数时,它的最高位等于一。强制转换为 64 位数值时,有两种可能性:最高位全设为零,保留无符号整数和十六进制数值,或者最高位全设为一,保留带符号数值。后面一种被称为符号扩展

在 MASM 表达式中、C++ 表达式中以及显示数值时,调试器遵循不同的规则实现符号扩展。

MASM 表达式中的符号扩展

在某种情况下,MASM 表达式求解器会把数值自动进行符号扩展。符号扩展只影响 0x80000000 和 0xFFFFFFFF 之间的数,包括 - 换句话说,就是最高位等于 1 的32 位数。

所以,当调试器把 0x12345678 转换为 64 位数时总是保持 0x00000000`12345678。另一方面,当 0x890ABCDE 被转换为 64 位值时可能保持 0x00000000`890ABCDE 或者可能被扩展为 0xFFFFFFFF`890ABCDE。

0x80000000 和 0xFFFFFFFF 之间的数是否会被符号扩展,根据下面的标准:

C++ 表达式中的符号扩展

调试器使用下面的规则计算一个 C++ 表达式:

符号扩展数和 64 位数的显示

不同于 32 位和 16 位寄存器,在调试器内部所有数值都被当做 64 位值存储。然而,当数值满足一定条件时,在命令输出中它将被当做 32 位数显示。

调试器显示数值的算法如下:

这些规则会产生一个结果,当一个数被显示为 0x80000000 到 0xFFFFFFFF 之间的 32 位数值时,你不能确定它的最高 32 位全部是一还是零。要区别这两种情况你需要在这个数上执行一个额外的计算操作(例如屏蔽最高的一位或多位然后显示结果)。

Build machine: CAPEBUILD