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之后,双精度值包含的值与无符号整数相同。像这样:unsigned int num; // some arbitrary 32 bit unsigned number
double d = num;
由于花了我一些时间才弄清楚,所以我认为它可以帮助别人比我更快地找到解决方案。