如何在C89中将布尔值插入到位域中

据我所知,在C89中,所有布尔表达式都是整型。 这也意味着表示bool的函数参数通常由int参数表示。

现在我的问题是我如何最理想地将这样一个int放入一个位域,以便它只占用一个位(现在让我们忽略填充)。

这里的第一件事是使用哪种类型。 使用int或任何其他无符号类型不起作用,因为当只有一个位时,只能表示-10 (至少使用二进制补码)。

尽管-1技术上评估为true ,但这并不理想,因为实际上将其分配而没有未定义的行为可能相当棘手。

所以应该为位域选择一个无符号类型:

typedef struct bitfield_with_boolean {
    unsigned int boolean : 1;
} bitfield_with_boolean;

接下来的问题是如何分配该位域。 只是采取一个int或类似的将无法工作,因为downcast会截断值,所以如果最低位未设置,则先前计算为true的值现在会突然评估为false

据我所知,布尔运算符保证总是返回01 。 所以我解决这个问题的想法是这样的:

#define to_boolean(expression) (!!(expression))

所以为了分配我会做的价值:

bitfield_with_boolean to_bitfield(int boolean) {
    bitfield_with_boolean bitfield = {to_boolean(boolean)};

    return bitfield;
}

这是正确的,还是有更好的方法?

注意:

我知道这个问题从C99开始就完全解决了,因为铸造到_Bool将保证总是会导致01 。 其中0只是输入值为0


是的,你的解决方案是正确的。 但是,我不会将它隐藏在宏的后面,我不会使用all_lowercase字母命名宏。

!!var是足够的惯用语言,我会说在代码中很好。

替代品包括var != 0 ,当然, var ? 1 : 0 var ? 1 : 0

链接地址: http://www.djcxy.com/p/40389.html

上一篇: How to insert booleans into a bitfield in C89

下一篇: How to get SIZE