使用聯合重新解釋值

一些 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);
}

這種技術過去在計算機圖形和遊戲中被廣泛使用,因為與使用浮點運算相比它具有更高的速度,並且非常折衷,失去一些準確性並且非常便攜以換取速度。