指定struct成员变量的位数
2012-01-20 22:32
267 查看
在定义结构体的时候,我们在指定成员变量的类型的同时也可以指定成员变量所占的位数,其定义形式为:
虽然拆分基本成员变量在语法上是得到支持的,但是并不等于我们想怎么分就怎么分,例如下面的拆分显然是不合理的:
测试代码:
输出:
size of TS: 4
size of unsigned int: 4
val1:0,val2:1,val3:999
val1只占一位,2的二进制为10,故而val1的值为0,val2同理。
参考:/article/5566683.html
struct teststruct { 类型1 成员1 :成员1所占位数; 类型2 成员2 :成员2所占位数; 类型3 成员3 :成员3所占位数; ...... };
虽然拆分基本成员变量在语法上是得到支持的,但是并不等于我们想怎么分就怎么分,例如下面的拆分显然是不合理的:
struct student { unsigned short sex : 1; unsigned short age : 12; };这是因为 1+12 = 13(但是这个结构所占的空间很可能是2个字节而不是13位),不能再组合成一个基本成员,不能组合成 char、int 或任何类型, 拆分的位数应该是合乎逻辑的,应仍然可以组合为基本成员变量 (这个和编译器的字节对齐属性有关)。
测试代码:
#include <stdio.h> typedef struct teststruct { unsigned int val1 : 1; unsigned int val2 : 2; unsigned int val3 : 29; }TS; int main() { TS tmp; printf("size of TS: %d\n",sizeof(tmp)); printf("size of unsigned int: %d\n",sizeof(unsigned int)); tmp.val1 = 2; tmp.val2 = 5; tmp.val3 = 999; printf("val1:%d,val2:%d,val3:%d\n",tmp.val1,tmp.val2,tmp.val3); system("pause"); return 0; }
输出:
size of TS: 4
size of unsigned int: 4
val1:0,val2:1,val3:999
val1只占一位,2的二进制为10,故而val1的值为0,val2同理。
参考:/article/5566683.html
相关文章推荐
- C - 指定结构体中成员变量的位数
- “Short a:4”——指定位数的成员变量
- 详解struct、class中成员变量的字节对齐
- C++ 字节对齐分析,struct成员指定位大小
- Effective C# 学习笔记(十二) 多用成员变量初始化,少用指定赋值
- C/C++ 结构体的一个高级特性 ―― 指定成员的位数
- C/C++结构体的一个高级特性――指定成员的位数
- 给一个类成员变量struct赋值.
- C/C++结构体的一个高级特性――指定成员的位数
- C语言中 struct成员变量顺序对内存的占用
- C语言中 struct成员变量顺序对内存的占用
- C/C++结构体的一个高级特性――指定成员的位数
- 与struct相关的宏定义 --- 根据成员变量偏移,获取struct起始地址
- 结构体struct的成员变量字节对齐问题详解
- C/C++ 结构体的一个高级特性 ―― 指定成员的位数
- C/C++结构体的一个高级特性――指定成员的位数
- golang中struct成员变量的标签(Tag)说明和获取方式
- spring加载properties文件,并将属性值注入到指定类的指定成员变量
- c / C++ 中的struct 和memcpy函数 class 对象成员变量内存是否连续
- 与struct相关的宏定义(成员变量偏移和获取struct起始地址)