[我一直在http://www.netlib.org/fdlibm/处查看一些代码,以了解某些功能的工作方式,并且我在查看e_log.c的代码以及在代码的某些部分显示的内容:
hx = __HI(x); /* high word of x */
lx = __LO(x); /* low word of x */
__ HI(x)和__LO(x)的代码是:
#define __HI(x) *(1+(int*)&x)
#define __LO(x) *(int*)&x
我真的不理解,因为我不熟悉这种类型的C。有人可以向我解释__HI(x)和__LO(x)在做什么吗?稍后在该函数的代码中也有一条语句:
__HI(x) = hx|(i^0x3ff00000);
有人可以向我解释一下如何使一个函数等于某物(我通常使用python,所以我真的不知道发生了什么)?总而言之,__ HI(x)和__LO(x)的作用以及程序对x的“高位字”和“低位字”的含义是什么。还有一个函数如何等于某物。
#define A B
是preprocessor指令,在编译之前在整个源代码中用文字B替换文字A。
#define A(x) B
是类似函数的预处理器宏,它使用参数x
进行参数化的预处理器替换。在这种情况下,B也可以B是x的函数。
#define __HI(x) *(1+(int*)&x)
#define __LO(x) *(int*)&x
// called as
__HI(x) = hx|(i^0x3ff00000);
由于这只是代码替换的问题,因此分配是完全合法的。为什么?因为在两种情况下,宏都用R-value替换。
在两种情况下,该右值都是int类型的变量:*带x的地址*将其转换为指向int的指针*尊重它(在__LO()
的情况下)*加1,然后在__HI ()
时遵从。它实际指向的内容取决于体系结构,因为指针算法实际上取决于体系结构。