C Bit Fields

转载自MSDN:     https://msdn.microsoft.com/en-us/library/yszfawxh.aspx

In addition to declarators for members of a structure or union, a structure declarator can also be a specified number of bits, called a "bit field." Its length is set off from the declarator for the field name by a colon. A bit field is interpreted as an integral type.

Syntax

struct-declarator:

declarator

type-specifier declarator opt constant-expression

The constant-expression specifies the width of the field in bits. The type-specifier for the declarator must be unsigned intsigned int, or int, and the constant-expression must be a nonnegative integer value. If the value is zero, the declaration has no declarator. Arrays of bit fields, pointers to bit fields, and functions returning bit fields are not allowed. The optional declarator names the bit field. Bit fields can only be declared as part of a structure. The address-of operator (&) cannot be applied to bit-field components.

Unnamed bit fields cannot be referenced, and their contents at run time are unpredictable. They can be used as "dummy" fields, for alignment purposes. An unnamed bit field whose width is specified as 0 guarantees that storage for the member following it in the struct-declaration-list begins on an int boundary.
 
//标准C规定 

//An unnamed bit field whose width is specified as 0  内存对齐int边界 
 

Bit fields must also be long enough to contain the bit pattern. For example, these two statements are not legal:

short a:17; /* Illegal! */
int long y:33; /* Illegal! */

This example defines a two-dimensional array of structures named screen.

struct 

    unsigned short icon : 8; 
    unsigned short color : 4; 
    unsigned short underline : 1; 
    unsigned short blink : 1;
} screen[25][80];

The array contains 2,000 elements. Each element is an individual structure containing four bit-field members: iconcolorunderline, and blink. The size of each structure is two bytes.

Bit fields have the same semantics as the integer type. This means a bit field is used in expressions in exactly the same way as a variable of the same base type would be used, regardless of how many bits are in the bit field.

Microsoft Specific
//注意此条是微软特有  

Bit fields defined as int are treated as signed. A Microsoft extension to the ANSI C standard allows char and long types (both signed and unsigned) for bit fields. Unnamed bit fields with base type longshort, or char (signed or unsigned) force alignment to a boundary appropriate to the base type.
//An unnamed bit field whose width is specified as 0  内存对齐基类型
 
如图:
 //基类型为char(1字节)
图片


图片


//基类型为unsigned(4字节)
图片



图片

Bit fields are allocated within an integer from least-significant to most-significant bit. In the following code

struct mybitfields

    unsigned short a : 4; 
    unsigned short b : 5; 
    unsigned short c : 7;
} test;

int main( void )

    test.a = 2;
    test.b = 31; 
    test.c = 0;
}

the bits would be arranged as follows:

00000001 11110010
cccccccb   bbbbaaaa

Since the 8086 family of processors stores the low byte of integer values before the high byte, the integer 0x01F2 above would be stored in physical memory as 0xF2 followed by 0x01.

END Microsoft Specific


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值