我正在考虑在我用C语言编写的小型语言实现中实现NaN标记。为此,我需要直接访问一个双精度浮点数的位。
我已经使用联合转换使其工作:
但是将类型转换为联合类型不符合标准的 ANSI C89。有可靠的方法可以实现这一点吗?
我已经使用联合转换使其工作:
typedef union
{
double num;
unsigned long bits;
} Value;
/* A mask that selects the sign bit. */
#define SIGN_BIT (1UL << 63)
/* The bits that must be set to indicate a quiet NaN. */
#define QNAN (0x7ff8000000000000L)
/* If the NaN bits are set, it's not a number. */
#define IS_NUM(value) (((value).bits & QNAN) != QNAN)
/* Convert a raw number to a Value. */
#define NUM_VAL(n) ((Value)(double)(n))
/* Convert a Value representing a number to a raw double. */
#define AS_NUM(value) (value.num)
/* Converts a pointer to an Obj to a Value. */
#define OBJ_VAL(obj) ((Value)(SIGN_BIT | QNAN | (unsigned long)(obj)))
/* Converts a Value representing an Obj pointer to a raw Obj*. */
#define AS_OBJ(value) ((Obj*)((value).bits & ~(SIGN_BIT | QNAN)))
但是将类型转换为联合类型不符合标准的 ANSI C89。有可靠的方法可以实现这一点吗?
- Is
-std=c89 -pedantic
clean? - Doesn't run afoul of strict aliasing rules?
Can be used in an expression context like this:
Value value = ... printf("The number value is %f\n", AS_NUM(value));
unsigned long
是32位的。你应该使用stdint.h
中的uint64_t
:不幸的是,那是一个C99头文件。 - gsg