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

How to insert booleans into a bitfield in C89

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

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

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

虽然 -1 在技术上评估为 true,但这并不理想,因为根据我的理解,在没有未定义行为的情况下实际分配它可能非常棘手。

因此应为位域选择无符号类型:

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

下一个问题是如何分配该位域。仅采用 int 或类似的方法是行不通的,因为向下转换会截断该值,因此如果未设置最低位,则先前计算为 true 的值现在会突然计算为 false.

据我所知,布尔运算符保证总是 return 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