【问题标题】:Basic Question regarding structs关于结构的基本问题
【发布时间】:2011-02-22 18:31:23
【问题描述】:

我正在浏览一个 Windows 设备驱动程序,我看到了这样的结构代码:

struct driver1
{
       UINT64 Readable     : 1; 
       UINT64 Writable     : 1; 
       UINT64 Executable   : 1; 
       UINT64 Control      : 3; 
       UINT64 Status       : 1; 
       UINT64 Reserved     : 51; 
       UINT64 Available1   : 5; 
       UINT64 IsMapped     : 1;
};

每个UINT64 是否代表一个位?冒号代表位吗?

【问题讨论】:

  • 您要查找的术语是“位域”

标签: c windows kernel bit-fields


【解决方案1】:

这意味着ReadableWritableExecutable 各占一点,Control 占 3、Reserved 51 等等。

请参阅http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html 了解更多信息。

UINT64 仅仅意味着整个位域将在一个 64 位无符号整数内。

【讨论】:

    【解决方案2】:

    就是这样,是的。它称为位域。该数字表示编码器要求该字段占用的位数。如果你把它们都加起来,你会发现它们加起来是 64。

    问题在于 C++(与 Ada 不同)没有提供真正的方法来保证整个结构只占用 64 位。因此,如果您在其他系统上编译它,而不是在它设计用于运行的系统上,我会检查一下以确定。

    当我用 C++ 编写设备驱动程序时,我不使用位域。我改用位掩码。当然,问题在于您必须了解您的平台如何对其字节进行排序。

    【讨论】:

      【解决方案3】:

      这些是bitfields in C,因此您可以通过结构独立访问这些位。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-04
        • 1970-01-01
        • 2013-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多