我一直在寻找如何做到这一点,但我还没有找到方法。除了逐个计算之外,还有其他方法可以计算这个差异吗?
例如:
0x7fffffffe070 - 0x7fffffffe066 = 0x04
0x7fffffffe066 - 0x7fffffffe070 = -0x04
0x7fffffffdbe0 - 0x7fffffffda98 = ????
为了理解这些结果,假设我们使用十六进制编辑器打开一个文件,并且有以下十六进制数字:8A B7 00 00 FF,其对应的十六进制偏移量为:0x7fffffffe066 0x7fffffffe067 0x7fffffffe068 0x7fffffffe069 0x7fffffffe070。数字 8A 和 FF 的十六进制偏移量之差为 0x04,因为它们有 4 个位置不同。
答案1
“十六进制偏移量”只是普通数字,没有特殊的减法规则。你得到不同的结果只是因为你的输入是错的:
我们有以下十六进制数:8A B7 00 00 FF,其对应的十六进制偏移量为:0x7fffffffe066 0x7fffffffe067 0x7fffffffe068 0x7fffffffe069 0x7fffffffe070。8A 和 FF 的十六进制偏移量之差为 0x04,因为它们有 4 个位置不同。
在十六进制中,0x9 首先后面跟着 0xA、0xB、0xC、0xD、0xE、0xF,只有那时0x10。因此,如果您有 5 个连续的字节,并且第四个字节位于 0x7FFF'FFFF'E069,则下一个字节将位于 0x7FFF'FFFF'E06A,不是0x7FFF'FFFF'E070。
换句话说,0x…E070 - 0x…E066 = 0xA
其实是正确的结果。
答案2
我不确定,但也许问题是如何手工计算差异?
您可以通过将其重写为加法来计算 AB 的差值。您可以先翻转/反转 B 中的所有位,然后将该值添加到 A。接下来,您将结果增加 1,并将结果修剪(缩小)为与原始操作数一样多的数字(或位数)。
使用来自他的问题的十六进制值的演示:
让我们计算一下 0x7fffffffe070 - 0x7fffffffe066:
7fffffffe070
800000001f99 + (this is 0x7fffffffe066 with all bits inverted)
===============
1000000000009
1 +
===============
A (or 10 decimal, or +0xa if you will)
现在让我们计算 0x7fffffffe066 - 0x7fffffffe070:
7fffffffe066
800000001f8f + (this is 0x7fffffffe070 with all bits inverted)
==============
fffffffffff5
1 +
==============
fffffffffff6 (or -10 decimal / -0xa)
一旦知道以下内容,就很容易翻转十六进制数字中的所有位:
0 = F (or 0000 ==> 1111)
1 = E (or 0001 ==> 1110)
2 = D
...
F = 0 (or 1111 ==> 0000)
等等...