使用union在整数和数组之间键入修剪

Cac*_*ito 3 c arrays unions type-punning

在整数和整数数组之间进行类型校正是否合法?

具体代码:

#include <nmmintrin.h>
#include <stdint.h>

union   Uint128 {
    __uint128_t uu128;
    uint64_t    uu64[2];
};

static inline   uint_fast8_t    popcnt_u128 (__uint128_t n)
{
    const union Uint128 n_u     = {.uu128 = n};
    const uint_fast8_t  cnt_a   = _mm_popcnt_u64(n_u.uu64[0]);
    const uint_fast8_t  cnt_b   = _mm_popcnt_u64(n_u.uu64[1]);
    const uint_fast8_t  cnt     = cnt_a + cnt_b;

    return  cnt;
}
Run Code Online (Sandbox Code Playgroud)

Jen*_*edt 5

是的,C标准明确规定了通过联合在所有数据类型之间进行类型修剪。对于数组,没有任何特殊规定禁止这样做。