为什么我必须为位域指定类型?
struct MyBitField
{
unsigned int i : 4;
}
struct MyBitField2
{
unsigned char i : 4;
}
Run Code Online (Sandbox Code Playgroud)
这两者有什么区别?为什么我需要指定一个类型?
位域是普通成员周围的“覆盖”,每个成员都有一个类型。回想一下,C++ 中的整数类型很大程度上继承自 C 中的类型,这些类型旨在巧妙地映射到目标体系结构上存在的任何原语。这是一个很方便的功能。位域位于该逻辑之上;他们不会取代它。
与此相关的一些事实:
位域的可用字节数取决于其类型(超出类型自然宽度的位被视为填充);
类型从根本上支撑了对象在 C++ 中的工作方式以及如何编码和解释这些对象的值。
位域功能可以有不同的设计吗?也许,作为语言中不需要特定底层类型的单独的一流事物?
也许吧,但是您需要新的规则来定义位域整数语义(有符号和无符号)以及每个赋值组合的转换规则。重点是什么?我们已经有了一个可以使用的类型系统。
当然,在您的情况下,显示的每个对象的语义是相同的。但还存在其他位域。您可能会问,为什么unsigned int和 都unsigned long存在于一个系统上,它们各自的范围相同:我们不会围绕非常具体的情况设计语言。
如果您想要的只是非类型化位的集合,那么这std::bitset<4>就是您正在寻找的。
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |