清晰解读C语言中的比特序、字节序、位域、大小端

本文详细介绍了C语言中的比特序(位序)概念,包括LSB 0 和 MSB 0 位序,并通过实例解释了它们的区别。接着,文章探讨了字节序和大小端模式,阐述了它们在多字节数据存储中的应用,并提供了判断系统大小端的方法。最后,讨论了位域的存储规则,指出位域的分配与系统字节序的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、比特序/位序

比特序表示一个字节中8个比特位(bit)之间的顺序问题。分为LSB 0 位序MSB 0 位序

LSB:最低有效位 MSB:最高有效位

LSB(least significant bit) 0位序:数据的最低位存放在字节的第0位

MSB (most significant bit) 0位序:数据的最高位存放在字节的第0位

例如有一个十进制的数为174,对应的二进制数为1010 1110.

1.在LSB 0 位序下,其存储形式如下图:

数据流的顺序为0-1-1-1-0-1-0-1

2.在MSB 0 位序下,其存储形式如下图:

数据流的顺序为1-0-1-0-1-1-1-0

CPU存储数据操作的最小单位是一个字节(Byte),其内部的比特序对程序员并不可见。

二、字节序和大小端

只有多字节数据存储时才会考虑大小端。

数据的高字节保存在内存的低地址,称为大端模式(大端序)

数据的高字节保存在内存的高地址,称为小端模式(小端序)

对于大端模式,一个占有4个字节类型的数据0x00112233在内存中如下分布:

对于小端模式,数据0x00112233在内存中如下分布:

### C语言的概念及用法 #### 什么是是C语言中的一个重要特性,允许开发者对结构体成员进行按操作。它主要用于节省内存空间并实现更精细的硬件控制[^1]。 #### 的特点 - **高效利用内存**:通过指定变量的具体宽来减少存储开销。 - **灵活性**:能够精确地定义数据所需的比特数,适用于嵌入式开发场景。 - **限制性**:由于可能跨越字节边界,其行为依赖于编译器实现和目标平台架构[^2]。 #### 定义与语法 在C语言中,可以通过`struct`关键字创建带有的结构体。每个成员由名称、冒号分隔符以及表示宽度的整数值组成: ```c struct BitField { unsigned int field1 : n; // 表示field1占n unsigned int field2 : m; // 表示field2占m }; ``` 其中 `n` 和 `m` 是正整数,分别指定了该字段占据多少。如果未命名某个字段,则此匿名字段仅作为填充用途[^3]。 #### 示例代码 下面展示了一个简单的例子说明如何使用保存一个八无符号字符型变量的不同部分: ```c #include <stdio.h> // 声明含的结构体 typedef struct { unsigned char b0 : 1; unsigned char b1 : 1; unsigned char b2 : 1; unsigned char b3 : 1; unsigned char b4 : 1; unsigned char b5 : 1; unsigned char b6 : 1; unsigned char b7 : 1; } Bits; int main() { unsigned char var = 0xD6; // 将整个字节赋给结构 Bits bits = *(Bits*)&var; printf("------------\n"); printf("var=%#x\n", var); printf("bits.b0=%d\n", bits.b0); printf("bits.b1=%d\n", bits.b1); printf("bits.b2=%d\n", bits.b2); printf("bits.b3=%d\n", bits.b3); printf("bits.b4=%d\n", bits.b4); printf("bits.b5=%d\n", bits.b5); printf("bits.b6=%d\n", bits.b6); printf("bits.b7=%d\n", bits.b7); printf("------------\n"); return 0; } ``` 运行上述程会得到如下输出结果: ``` ------------ var=0xd6 bits.b0=0 bits.b1=1 bits.b2=1 bits.b3=0 bits.b4=1 bits.b5=0 bits.b6=1 bits.b7=1 ------------ ``` 这里展示了如何解析单个字节内的各个独立,并打印它们的状态[^4]。 #### 需要注意的地方 - 不同平台上,的实际布局可能会有所不同,这取决于具体的编译器设置及其默认规则。 - 获取成员地址的操作被禁止,因为这些成员未必于连续的内存单元上。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何小胖的嵌入式学习之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值