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

发布时间:2024年01月24日

早上好 各位

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

?

?

文章来源:https://blog.csdn.net/qq_59398646/article/details/135763442
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。