将 4.294967296e9 添加到 double 有什么作用?

逆向工程 拆卸 漂浮
2021-06-11 00:43:33

我正在逆向工程一个应用程序,4.294967296e9如果数字为负,它通常会增加一个双精度数。部分拆解:

mov     eax, label_to_memory
fild    label_to_memory
test    eax, eax
jge     short some_label
fadd    ds:some_double_value
some_label:

如果我是对的,如果最高位没有设置,即它是一个正数,它就会跳转。some_double_value指向常数4.294967296e9

要了解这段代码在做什么,我需要知道为什么它添加了这个特定的数字,我发现的唯一一条信息是http://web.mit.edu/~mkgray/afs/bar/ 中的一行代码afs/net/project/attic/quipu/isode-8.0/others/ntp/ntpsubs.c其中说

#ifdef  VAX_COMPILER_FLT_BUG
    if (b < 0.0) b += 4.294967296e9;
#endif

那么,这个数字有什么意义呢?

附加信息:数字不能为负,因此这实际上永远不会发生。

1个回答

我实际上在写这个问题时找到了答案!

这个数字正是UINT_MAX + 1,存储为双精度数。因此,此代码似乎将无符号整数转换为双精度数fild指令将 32 位值加载为有符号值,在加上最大可能的无符号值 + 1 后,double 包含与无符号整数相同的值

所以编译器可能会自动从这样的事情中产生:

unsigned int num; // some arbitrary 32 bit unsigned number
double d = num;

由于我花了一些时间才弄明白,我认为这可能会帮助其他人比我更快地找到解决方案。