按位定义结构体

在工作中,经常遇到按位(bit)定义结构体 的情况。由于一个字节有8个位,这时,程序员往往对bit的位置产生困惑。现在给出一个例子,来说明位的定义次序。

#pragma pack(push,1)
 
typedef struct ST_TEST
{
    unsigned char    ucA:1;
    unsigned char    ucB:1;
    unsigned char    ucC:1;
    unsigned char    ucD:1;
    unsigned char    ucE:1;
    unsigned char    ucF:1;
    unsigned char    ucG:1;
    unsigned char    ucH:1;
} ST_TEST;
#pragma pack(pop)
 
#include <string.h>
#include <stdio.h>
int main(void)
{
    ST_TEST stTest;
    stTest.ucA = 1;
    stTest.ucB = 0;
    stTest.ucC = 0;
    stTest.ucD = 0;
    stTest.ucE = 0;
    stTest.ucF = 0;
    stTest.ucG = 1;
    stTest.ucH = 0;
 
    unsigned char ucTest;
    memcpy(&ucTest, &stTest, 1);
    //没有现成的打印二进制的方法,所以用16进制打印
    printf("%x", ucTest);
 
    scanf("%c", &ucTest);
    return 0;
}
 
结果是0x41,也就是二进制的0b01000001.可见,定义在一开头的ucA反而落到了最后,而倒数第二的ucG起始在左起正数第二。所以,结构体里定义比特,次序起始是反的。
--------------------- 
版权声明:本文为优快云博主「liji_digital」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/liji_digital/article/details/77986370

### C语言按位定义结构体赋值 在C语言中,可以通过`bit-field`(位域)来定义一个按位存储的结构体。这种技术允许开发者精确控制内存中的每一位,通常用于硬件驱动程序开发或需要高效利用空间的应用场景。 #### 1. 按位定义结构体 通过指定成员后的冒号以及整数数值,可以定义该成员所占的比特位数量。例如: ```c struct BitField { unsigned int flag : 1; // 占用1位 unsigned int value : 4; // 占用4位 }; ``` 在此例子中,`flag`占用1位,而`value`则占用4位[^1]。 #### 2. 结构体变量声明与初始化 一旦定义好按位结构体之后,就可以像普通结构体一样对其进行操作。以下是几种常见的初始化方式: ##### (1) 初始化时直接赋值 可以在定义结构体变量的同时完成其成员的初始赋值: ```c struct BitField bf = {1, 8}; // 将flag设置为1,value设置为8 ``` 这里需要注意的是,对于`unsigned int flag : 1`, 只能接受0或者1作为合法输入;而对于`unsigned int value : 4`, 则最大可表示范围是从0到\(2^4-1=15\)之间的无符号整数[^4]。 ##### (2) 动态赋值 如果希望稍后再给各个字段分配具体的值,则可通过如下方法逐一设定它们的内容: ```c bf.flag = 0; bf.value = 7; ``` 同样地,在动态赋值过程中也需遵循各字段所能容纳的最大值限制条件[^5]。 #### 示例代码展示 下面给出一段完整的演示代码片段,它展示了如何创建并使用带有位域特性的结构体实例: ```c #include <stdio.h> // 定义带位域的结构体 struct BitField { unsigned int flag : 1; // 占用1位 unsigned int value : 4; // 占用4位 }; int main(void){ struct BitField bf; // 方法一:定义时即赋予初值 struct BitField init_bf = {1, 8}; printf("init_bf -> flag=%d, value=%u\n", init_bf.flag, init_bf.value); // 方法二:运行期间单独设值 bf.flag = 0; bf.value = 7; printf("bf -> flag=%d, value=%u\n", bf.flag, bf.value); return 0; } ``` 此段代码首先定义了一个名为BitField的新类型,并包含了两个分别占据不同长度比特位置的成员变量(flag 和 value) 。接着在main函数内部既体现了静态初始化又实现了动态修改这两种情形下的实际应用效果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值