以 C99 为目标时,我可以使用以下代码将一个值截断并拆分double
为两个 32 位整数:
#include <stdint.h>
void split(double d, unsigned long *most_significant_word, unsigned long *least_significant_word)
{
uint64_t i = (uint64_t)d;
*most_significant_word = i >> 32;
*least_significant_word = i & 0xffffffff;
}
然而,C89 似乎没有定义 64 位整数类型,所以我不能使用编译器来执行截断。即使不需要截断(值已经表示一个整数),我也不能使用像&
or这样的位运算符,因为它们对值>>
不起作用。double
那么,如何split()
在纯 C89 中实现上述函数(因此不依赖 64 位整数),返回构成存储在double
值中的 53 位整数的 21/32 位字?