早上好 各位
上述我们说了 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 手动开启下一存储单元??
?
?