如何将布尔值插入 C89 中的位域
How to insert booleans into a bitfield in C89
据我了解,在 C89 中,所有布尔表达式都是整数类型。这也意味着表示 bool 的函数参数通常由 int
参数表示。
现在我的问题是如何最理想地采用这样的 int
并将其放入位域中,以便它只占用一位(现在让我们忽略填充)。
这里的第一件事是使用哪种类型。使用 int
或任何其他无符号类型都不起作用,因为当只有一位时,只能表示 -1
和 0
(至少用二进制补码)。
虽然 -1
在技术上评估为 true
,但这并不理想,因为根据我的理解,在没有未定义行为的情况下实际分配它可能非常棘手。
因此应为位域选择无符号类型:
typedef struct bitfield_with_boolean {
unsigned int boolean : 1;
} bitfield_with_boolean;
下一个问题是如何分配该位域。仅采用 int
或类似的方法是行不通的,因为向下转换会截断该值,因此如果未设置最低位,则先前计算为 true
的值现在会突然计算为 false
.
据我所知,布尔运算符保证总是 return 0
或 1
。所以我解决这个问题的想法是这样的:
#define to_boolean(expression) (!!(expression))
所以为了分配我会做的价值:
bitfield_with_boolean to_bitfield(int boolean) {
bitfield_with_boolean bitfield = {to_boolean(boolean)};
return bitfield;
}
是否正确,或者是否有更好的方法?
注意:
我知道这个问题从 C99 开始就完全解决了,因为强制转换为 _Bool
总是会导致 0
或 1
。如果输入的值为 0
.
,则 0
仅是结果
是的,您的解决方案是正确的。但是,我不会将它隐藏在宏后面,也不会使用 all_lowercase
个字母来命名宏。
!!var
足够惯用,我会说它在代码中很好。
备选方案包括 var != 0
,当然还有 var ? 1 : 0
。
据我了解,在 C89 中,所有布尔表达式都是整数类型。这也意味着表示 bool 的函数参数通常由 int
参数表示。
现在我的问题是如何最理想地采用这样的 int
并将其放入位域中,以便它只占用一位(现在让我们忽略填充)。
这里的第一件事是使用哪种类型。使用 int
或任何其他无符号类型都不起作用,因为当只有一位时,只能表示 -1
和 0
(至少用二进制补码)。
虽然 -1
在技术上评估为 true
,但这并不理想,因为根据我的理解,在没有未定义行为的情况下实际分配它可能非常棘手。
因此应为位域选择无符号类型:
typedef struct bitfield_with_boolean {
unsigned int boolean : 1;
} bitfield_with_boolean;
下一个问题是如何分配该位域。仅采用 int
或类似的方法是行不通的,因为向下转换会截断该值,因此如果未设置最低位,则先前计算为 true
的值现在会突然计算为 false
.
据我所知,布尔运算符保证总是 return 0
或 1
。所以我解决这个问题的想法是这样的:
#define to_boolean(expression) (!!(expression))
所以为了分配我会做的价值:
bitfield_with_boolean to_bitfield(int boolean) {
bitfield_with_boolean bitfield = {to_boolean(boolean)};
return bitfield;
}
是否正确,或者是否有更好的方法?
注意:
我知道这个问题从 C99 开始就完全解决了,因为强制转换为 _Bool
总是会导致 0
或 1
。如果输入的值为 0
.
0
仅是结果
是的,您的解决方案是正确的。但是,我不会将它隐藏在宏后面,也不会使用 all_lowercase
个字母来命名宏。
!!var
足够惯用,我会说它在代码中很好。
备选方案包括 var != 0
,当然还有 var ? 1 : 0
。