使用联合重新解释值

一些 C 实现允许代码写入联合类型的一个成员然后从另一个成员读取以执行某种重新解释转换(将新类型解析为旧类型的位表示)。

然而,重要的是要注意,C 标准当前或过去不允许这样做并且将导致未定义的行为,然而,编译器提供了非常常见的扩展(因此,如果你计划执行此操作,请检查编译器文档)。

这种技术的一个真实例子是快速反向平方根算法,该算法依赖于 IEEE 754 浮点数的实现细节来比使用浮点运算更快地执行反平方根,该算法可以通过指针转换来执行(这是非常危险并打破严格的别名规则)或通过联合(仍然是未定义的行为,但在许多编译器中工作):

union floatToInt
{
    int32_t intMember;
    float floatMember; /* Float must be 32 bits IEEE 754 for this to work */
};

float inverseSquareRoot(float input)
{
    union floatToInt x;
    int32_t i;
    float f;
    x.floatMember = input;     /* Assign to the float member */
    i = x.intMember;           /* Read back from the integer member */
    i = 0x5f3759df - (i >> 1);
    x.intMember = i;           /* Assign to the integer member */
    f = x.floatMember;         /* Read back from the float member */
    f = f * (1.5f - input * 0.5f * f * f);
    return f * (1.5f - input * 0.5f * f * f);
}

这种技术过去在计算机图形和游戏中被广泛使用,因为与使用浮点运算相比它具有更高的速度,并且非常折衷,失去一些准确性并且非常便携以换取速度。