【发布时间】:2016-02-29 13:16:36
【问题描述】:
当面向 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 位整数类型,所以我不能使用编译器来执行截断。即使不需要截断(该值已经表示一个整数),我也不能使用像 & 或 >> 这样的位运算符,因为它们不适用于 double 值。
那么,上面的 split() 函数如何在纯 C89 中实现(因此不依赖于 64 位整数),返回构成存储在 @987654327 中的 53 位整数的 21/32 位字@值?
【问题讨论】:
-
C89 不提供
stdint.h。您需要执行特定的细节。由于不提供long long,如何读取64位值? -
@Olaf:但是,C89 要求
long至少为 32 位宽。对于输出,使用unsigned long应该没问题。 -
@MatteoItalia:这与我的评论有何矛盾?我想我清楚地写了它是特定于实现的,并非不可能。仅仅依靠
long拥有32 位是非常错误的。请参阅 POSIX64!不过,更大的问题是 64 位类型。 -
@Olaf:我以为你指的是输出类型; 64位类型无关紧要,您可以在
double中进行所有数学运算。 -
@rubenvb:您的问题包括它的答案:“假设 int 是 32 位宽”。请阅读定义的实现是什么意思!我没有心情再重复一遍。