关于结构的基本问题

时间:2011-02-22 18:31:24

标签: c windows kernel bit-fields

我正在浏览一个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代表一个位吗?冒号代表位吗?

3 个答案:

答案 0 :(得分:3)

这意味着ReadableWritableExecutable每个占用一点,Control占用3,Reserved 51等等。

有关详细信息,请参阅http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html

UINT64只是意味着整个位域都在64位无符号整数内。

答案 1 :(得分:3)

这就是想法,是的。它叫做bitfield。该数字表示编码器要求该字段占用的位数。如果你把它们全部计算在内,你会发现它们总计达64个。

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

当我用C ++编写设备驱动程序时,我不使用位域。我改用bitmasks。那里的问题当然是你必须知道你的平台如何命令它的字节。

答案 2 :(得分:1)

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