c++之说_9_1|自定义类型 struct 位域操作

早上好 各位

上述我们说了 struct 大概的内存分布情况(没和你们说内存对齐规则)

以及在指针上面来说  解释地址的类型

现在说说 struct 的位域

这个也是我不久前才知道的  我也是个萌新嘛 

写下来 一个是 做备忘录  一个是 给同为萌新的你 

做做参考  

语法其实很简单

struct Bit

{

   char a :1;

   char  b:6;

   char  c:8;

   char  d:1;

}

sizeof Bit = 2  //刚好二字节

位域,主要就是操控位  

计算机基本存储单元是字节 byte

但一字节 里面 还有 8位 

1 byte = 8 bit

8个二进制数

a2d36a508d034ba0873f356827500210.jpg

 而 每一 bit 中 只能是 0/1 两个数值

913ecaf641e941a7bb78e5192813f5e5.jpg

 而位域 就是 本该 使用字节大小表示 一个变量

位域 用了 位(比特) 大小 表示 一个变量

struct Bit

{

   char a :1;

   char  b:6;

   char  c :1;

}

sizeof Bit  = 1  //一字节大小

Bit 内部 有 3个 char 类型变量 

本来应该是 3字节 

什么这也太抠了 

如今我的内存动不动就是 8 Gb以上

Gb 到 bit  那数字得多大

1Gb = 1 * 1024 (Mb)  * 1024 (Kb) * 1024(b)  b

1,073,741,824  这是一个很庞大的数值

只能说这是现在  以前内存没那么丰腴

而且就算是现在  内存被素材( 图片  视频  音乐)

这些常见的东西  占去很大一部分  

 //main 函数中

Bit A;

A.a = 1;

A.b = 1;

A.c = 1;

f3a0a1247ce442bc960ceeff86d02e4d.jpg

 注意 都有存数的最大值

比如

A.a 是 1位  最大值 只能 存 1  

2 ^1 = 2  是代表 一位 能表示两个数 0  /  1  

A.b 是 6位  最大值 只能 存 63

2 ^6 = 64 是代表 一位 能表示64个数 0 1 2 3... 63

64 个数 中包含 一个 0  最大值 64 -1=63

 现在说 

如果 

存数大于这个范围会如何

A.a = 2;  // 2  = 10 b (二进制)

而a 只有 一位  10b 却要两位 

如何呢?  只能取低位的1位了

就是 0  ,  1 被丢弃了

所以 

A.a = 2;  // 2  = 10 b (二进制)

A.a = ?  答案是 0

如果

  A.a = 3;  // 3  = 11 b (二进制)

  a 只有一位  取低位 1

则 A.a = ?  答案是 1

二进制中每一位代表的十进制数

1 2 4 8 16 32 64 128

计算 就是 每一位乘以 自己位对应的十进制数 再相加 结果就是最终的十进制数

比如

10101011 b  注意 二进制数 在书写上 是反的

高位在前 低位在后

1 * 128 + 0 * 64 + 1  * 32 + 0*16 + 1*8 + 0* 4 + 1 * 2 + 1 *1 

=  128 + 32 + 8 + 2 + 1

= 171 

3f3099ff41bb462c855463733093d861.jpg 

注意事项

一:

位域 只能是 整型的类型  浮点数类型 不可

可  char  short  int  (无符号的也可)

不可  float 

二:

分配的位大小  不能比类型所代表的最大bit 大

如 

不可  char b:9

可      char b:8

三:

一字节 内的 位不够分配时 会自动开启下一字节

char a:7

char b :5

如此  b 就在上一字节 占一位 下一字节占 4位

四:

位域有个特性  可以手动的开启下一字节

char a :7

char b:5

现在我要 a  b 分别在两个字节中如何解决

使用 char :0  就可

char a :7

char:0

char b:5

:0 手动开启下一存储单元