C如何将标量类型转换为非标量和向后?

时间:2016-04-08 09:01:27

标签: c

我宣称自己是一个位域(u8意味着未记忆的整数8)

typedef struct build_field{

    u8 build : 5;
    u8 ability : 1;
    u8 hability : 1;
    u8 shinyness : 1;

} build_field;

现在我想要转换函数返回的传入u8值,这样我就可以将它用作位域。

build_field f = (build_field) func_that_returns_u8();

此外,我想将其转换为u8值。

u8 x = (u8) field;

但我的C编译器不会让我做任何操作。知道如何解决问题吗?

1 个答案:

答案 0 :(得分:4)

使用联盟:

union myunion
{
    u8 value;
    build_field field;
};

union myunion m;
m.value = func_that_returns_u8();
u8 a = m.ability;

确保结构build_field中的成员之间没有填充,否则这将无效。

更明智的选择是从整数中提取位。让我们说值中的位与结构中的成员的顺序相同。要获得habilityability的值,请执行以下操作:

u8 value = func_that_returns_u8();
build_field f = { 0 };
f.hability = ( ( unsigned int )value >> 6U ) & 1U;
f.ability = ( ( unsigned int )value >> 5U ) & 1U;