早上好 各位
上述我们说了 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个二进制数
而 每一 bit 中 只能是 0/1 两个数值
而位域 就是 本该 使用字节大小表示 一个变量
位域 用了 位(比特) 大小 表示 一个变量
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;
注意 都有存数的最大值
比如
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
注意事项
一:
位域 只能是 整型的类型 浮点数类型 不可
可 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 手动开启下一存储单元