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

2023-05-16

一、比特序/位序

比特序表示一个字节中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在内存中如下分布:

常见CPU的字节序:

类别举例
大端模式51单片机,STM8
小端模式X86,STM32

大小端各有优势:小端模式强制转换类型时不需要调整字节内容,直接截取低字节即可;大端模式由于符号位为第一个字节,很方便判断正负。如果判断不出当前系统的大小端模式,可用以下2种方法进行判断:

1.通过强制类型转换截断

bool IsBigEndian(void)
{
    uint16_t a = 0x1234;
    uint8_t b = *(char*)&a;
    if(0x12 == b)
    {
        return true;
    }
    return false;
}

2.利用联合共享内存的特性,截取低地址部分

union NUM
{
    uint16_t a;
    uint8_t b;
}num;

bool IsBigEndian(void)
{
    num.a = 0x1234;
    if(0x12 == num.b)
    {
        return true;
    }
    return false;
}

计算机在内存中存放数据的顺序都是从低地址到高地址,大小端的差异只是体现在首先取低字节的数据存放在低地址还是取高字节的数据存放在低地址;此外大小端只是数据在存储时的表现,而非在寄存器中参与运算的表现。

字节序为小端序的CPU通常位序为LSB,而字节序为大端序的CPU采用的位序既有MSB,也有LSB。

三、位域

位域的写入顺序和当前系统字节序有关:先定义的位域在大端环境从MSB开始分配。如果为小端环境则先定义的位域从LSB开始分配。

对于下述代码的结构体:

struct bitfield
{
    uint8_t a:1;
    uint8_t b:2;
    uint8_t c:3;
    uint8_t d:2;
}bf;
bf.a = 1;
bf.b = 2;
bf.c = 3;
bf.d = 3;

对于大端,位域的写入顺序为:

对于小端,位域的写入顺序为:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Java中this关键字的几种用法

    1 当成员变量和局部变量重名时 xff0c 在方法中使用this 时 xff0c 表示的是该方法所在类中的成员变量 xff08 this 是当前对象自己 xff09 如 xff1a public class Hello String s 6
  • WIN10 ping不通 VMWare CentOS7

    如题 Win10 ping不通VMWare下的Centos7 因为使用的是NAT模式 xff0c 所以检查虚拟网络编辑器下面的配置 VMWare下编辑 gt 虚拟网络编辑器 查看VMnet8的IP 设置虚拟机的IP地址和VMnet同一段 启
  • 计算机视觉数据集大全 - Part2

    转载自http homepages inf ed ac uk rbf CVonline Imagedbase htm Index by Topic Action Databases Agriculture Attribute recogni
  • Server unexpectedly closed network connection的解决

    1 apt get remove openssh server 2 sudo apt install openssh server 3 sudo service ssh start 4 ps aux grep ssh 5 sudo apt
  • STM32 GPIO模拟UART串口:最简延时方式

    STM32 GPIO模拟UART串口 xff1a 最简延时方式 在一些应用场景 xff0c MCU的硬件UART资源不足时 xff0c 或者可用于硬件UART配置的管脚优先配置给了其它功能使用 xff0c 就可以通过GPIO模拟UART功能
  • 【C++】带你深入理解vector

    目录 1 vector的介绍 2 vector类方法的模拟实现 2 1 vector类构造函数的实现 2 2 begin 和end 2 3 size capacity 和empty 2 4 运算符 的重载 2 5 reserve 2 6 r
  • 2019年个人在嵌入式领域上的发展思路

    摘自 xff1a 嵌入式软件工程师前期职业生涯规划 嵌入式软件工程师学习路线 1 打好嵌入式软件编程的基础 这一阶段重点打好嵌入式软件编程的基础 xff0c 包括 学习Linux系统的基本应用Linux的常用命令C语言编程基础常用的数据结构
  • 【嵌入式实战】STM32 Bootloader 快速实现(超详细)

    文章目录 原创声明前言一 Bootloader 是什么 xff1f 二 BootLoader 的实现2 1 生成 bin 文件2 2 确认应用程序的起始位置2 3 编写引导程序 三 App 的实现3 1 修改 IROM1 的位置3 2 修改
  • 【RTX51 Tiny高级】14-修改默认产生时间片的定时器T0为其它定时器

    01 修改默认定时器T0的场合 为什么要修改RTX Tiny的默认定时器T0 xff0c 具有以下2个场合 xff1a 1 T0已经有用途 在本来已经完成的系统下移植RTX Tiny xff0c 本来的系统定时器T0已经有比较复杂的用途 x
  • 【嵌入式底层知识修炼】按键和LED共用IO口的分时复用扫描方法

    文章目录 01 PCB原理图例程02 分时复用的注意项和设计2 1 注意项2 2 设计 03 代码实现 只要我跑的速度够快 xff0c 寂寞就追不上我 只要Key和Led切换速度够快 xff0c 人眼就看不出来 小白 如果你存在按键Key和
  • 【C语言冷知识】01_语法和语义,脱离天际的思考

    文章目录 01 语法和语义是什么02 为什么要知道语法和语义03 怎么做才能摸清语法和语义 我们先来哲学三问 xff1a 语法和语义是什么 为什么要知道语法和语义 怎么做才能摸清语法和语义 01 语法和语义是什么 任何编程语言都离不开语法和
  • 树莓派系统镜像备份

    SD卡系统镜像备份 引言1 下载镜像备份脚本2 查看sd卡设备名称3 复制镜像4 压缩镜像 引言 SD卡系统镜像备份有多种方式 xff0c 最简单粗暴的是使用Win32diskImager工具 xff0c 将SD卡的镜像直接读取 xff0c
  • 【C语言冷知识】02_从上帝视角看变量

    文章目录 01 变量的语法和语义02 变量的语法03 变量的语义04 变量的语法和语义实践 01 变量的语法和语义 在上文中提及研究编程语言的语法和语义能让自己更加清晰看透本质 xff0c 知其然并知其所以然 xff0c 接下来我们讨论一个
  • 【C语言冷知识】03_作用域和生命周期,变量的自我修养

    文章目录 01 变量的作用域和生命周期02 变量的作用域03 变量的生命周期04 回答问题 01 变量的作用域和生命周期 上一文我们从上帝的视角去看变量 xff0c 看透了变量的本质 xff0c 是一段有定义 有意义和可变的内存 xff0c
  • 【project】ZigBee小型环境监测系统(+源代码)

    当时想把整个学期所学内容联系起来 xff0c 所以有了这个数据库 43 ZigBee 43 Qt的小型环境监测系统 xff0c 存档并分享源代码 文章目录 00 设计篇01 硬件篇02 软件篇03 测试篇网盘链接 00 设计篇 该系统用于测
  • FreeRTOS笔记(六)列表与任务控制块

    文章目录 01 列表02 列表与任务控制块03 总结 上一文链接 xff1a FreeRTOS笔记 xff08 五 xff09 任务状态 01 列表 上一文提及到 xff0c 任务具有多种状态 xff0c 例如就绪 运行 阻塞等等 xff0
  • FreeRTOS笔记(七)开启调度器

    文章目录 01 vTaskStartScheduler 02 xTaskCreate 03 总结 上一文链接 xff1a FreeRTOS笔记 xff08 六 xff09 列表与任务控制块 01 vTaskStartScheduler 调度
  • FreeRTOS笔记(八)任务切换

    文章目录 01 SVC和PendSV1 1 SVC中断1 2 PendSV中断 02 任务切换2 1 上下文2 2 切换场合2 3 PendSV Handler 03 总结 上一文链接 xff1a FreeRTOS笔记 xff08 七 xf
  • 如何在Windows上用Qt调用cmd命令行并获得命令结果(+源代码)

    文章目录 01 适用场合02 环境要求03 操作步骤3 1 界面3 2 界面的各种响应3 3 QProcess的各种响应3 4 运行结果 04 源代码05 总结 网上的教程基本没有交互的过程 xff0c 官网也没有Demo xff0c 只有
  • MAG02 IMU传感器模块替代MPU6050模块介绍

    MAG02模块内置TDK高精度6轴IMU 惯性测量单元 xff09 传感器芯片 xff0c 通过处理器读取传感器数据 xff0c 并经过内部复杂运算后通过串口输出加速度 xff0c 角速度 xff0c 角度等数据 xff0c 大大减轻了用户

随机推荐