C语言之什么是大小端,数组大小端,位域大小端,结构体大小端

2023-05-16

公众号:嵌入式不难

本文仅供参考学习,如有错误之处,欢迎留言指正。

理解大小端之前必须明白的三点

  1. 内存地址始终以字节为单位
  2. 大小端只针对基本数据类型
  3. 存在位域的情况下,小端模式下先定义的位域从LSB(最低有效位)开始,大端模式下先定义的位域从MSB(最高有效位)开始

首先解释下以上三点
第一点,内存地址存储的最小数据大小就是字节,例如一个变量char temp的地址0x10000000,temp值为0x55,由于char类型只占用一个字节,那么temp变量就只占用0x10000000这个内存地址,不会占用其他内存地址,那假如变量是个int型呢?占用的字节数可能是4字节,这个时候内存和内存值又是怎么分配的呢?这个有待后面分析。
第二点,大小端只针对基本数据单元类型,那么什么是基本数据类型单元呢,char, int, float, double,那什么不是基本数据类型呢?例如:数组,结构体,联合等等。
第三点,先定义的位域因大小端情况会表示最高位或者最低位。

大小端影响了什么?

当基本数据类型占用字节数超过了1字节后,大小端决定了数据按照什么顺序存储在内存里

既然字节数超过了1个字节才有影响,那么就会一个疑问,char型数据占用字节数为1个字节,那么char型数据在大小端的模式下,会有什么不同吗?答案是没有。

什么是大小端?

  1. 大端(Big-Endian):高地址存放低位
  2. 小端(Little-Endian):高地址存放高位

这里有几个概念:高地址,低地址,高位,低位,其中高地址,低地址是针对内存地址而言,高位,低位是针对数据类型的bit位的高低而言。

如何根据具体情况分析

分析步骤:

  1. 首先找出基本数据类型,明确数据占用字节数以及高位,低位情况
  2. 明确变量地址始终指向变量的低地址
  3. 根据大小端的特性来套表格

举例:

例1(基本数据类型):int temp = 0x12345678;

假设 temp 的地址为 0x10000000 ,按照上面的分析步骤来拆分解析

  1. int型占用字节数为4字节,将数据按照字节为单位的高位,低位分解如下:0x12(高位),0x34,0x56 ,0x78 (低位)
  2. 由1点可知,基本数据类型占用内存为4字节,所以内存地址范围为 0x10000000~ 0x10000003
  3. 根据大小端的特性来套表格如下
大端模式
内存地址内存值步骤
0x100000000x124.依次取值
0x100000010x343.依次取值
0x100000020x56 2.依次取值
0x100000030x78 1.高地址存放低位
小端模式
内存地址内存值步骤
0x100000000x78 4.依次取值
0x100000010x56 3.依次取值
0x100000020x34 2.依次取值
0x100000030x12 1.高地址存放高位
例2(数组):short int temp[2] = {0x1234,0x5678};

假设 temp 的地址为 0x10000000 ,按照上面的分析步骤来拆分解析

  1. short int型占用字节数为2字节,将数据按照字节为单位的高位,低位分解如下:0x12(高位),0x34(低位),0x56 (高位),0x78 (低位)
  2. 由1点可知,基本数据类型占用内存为2字节,但是由两个元素,所以内存地址范围为 0x10000000~ 0x10000003
  3. 根据大小端的特性来套表格如下
大端模式
内存地址内存值步骤
0x100000000x122.依次取值
0x100000010x341.高地址存放低位
0x100000020x56 4.依次取值
0x100000030x78 3.高地址存放低位
小端模式
内存地址内存值步骤
0x100000000x34 2.依次取值
0x100000010x12 1.高地址存放高位
0x100000020x784.依次取值
0x100000030x563.高地址存放高位
例3(位域结构体):struct {int b1:1; int b2:2; int b3:3; int b4:4; char b5:5;}temp = {.b1=1, .b2=2, .b3=3, .b4=4, .b5=5 };

假设 temp 的地址为 0x10000000 ,按照上面的分析步骤来拆分解析

  1. 首先分析位域情况

大端模式下,假设-表示0,则int值为0xCD000000,char值为0x28

大端下temp的int值位域分布如下

bit位313029282726252423222120191817161514131211109876543210
b1b2b2b3b3b3b4b4b4b4
bit值1100110100----------------------

大端下temp的char值位域分布如下

bit位76543210
b5b5b5b5b5
bit值00101---

小端模式下,假设-表示0,则int值为0x0000011D,char值为0x05

小端下temp的int值位域分布如下

bit位313029282726252423222120191817161514131211109876543210
b4b4b4b4b3b3b3b2b2b1
bit值----------------------0100011101

小端下temp的char值位域分布如下

bit位76543210
b5b5b5b5b5
bit值---00101
  1. int型占用字节数为4字节,char型占用字节数为1字节
  • 大端模式下将数据按照字节为单位的高位,低位分解如下:0xCD(高位),0x00,0x00,0x00(低位),0x28(字节)
  • 小端模式下将数据按照字节为单位的高位,低位分解如下:0x00(高位),0x00,0x01,0x1D(低位),0x05(字节)
  1. 由1,2点可知,基本数据类型占用内存为4字节+1字节,所以内存地址范围为 0x10000000~ 0x10000004
  2. 根据大小端的特性来套表格如下
大端模式
内存地址内存值步骤
0x100000000xCD4.依次取值
0x100000010x003.依次取值
0x100000020x002.依次取值
0x100000030x001.高地址存放低位
0x100000040x285.高地址存放低位
小端模式
内存地址内存值步骤
0x100000000x1D 4.依次取值
0x100000010x013.依次取值
0x100000020x002.依次取值
0x100000030x001.高地址存放高位
0x100000040x055.高地址存放高位

实验验证环境属于大端还是小端

测试代码如下:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int temp1 = 0x12345678;
    short int temp2[2] = {0x1234, 0x5678};
    struct{
        int     b1:1;
        int     b2:2;
        int     b3:3;
        int     b4:4;
        int     bn:22;//这里是否需要占位根据编译器而定
        char    b5:5;
        char    bx:3;
    }temp3={.b1=1, .b2=2, .b3=3, .b4=4, .bn=0, .b5=5, .bx=0};

    char *_p1, *_p2;
    int *_p3;

    _p1 = (char *)&temp1;
    if(*_p1==0x12) printf("基本数据类型测试:大端模式\n");
    else if(*_p1==0x78) printf("基本数据类型测试:小端模式\n");
    else printf("基本数据类型测试:测试错误\n");

    _p1 = (char *)&temp2[0];
    _p2 = (char *)&temp2[1];
    if(*_p1==0x12 && *_p2==0x56) printf("数组类型测试:大端模式\n");
    else if(*_p1==0x34 && *_p2==0x78) printf("数组类型测试:小端模式\n");
    else printf("数组类型测试:测试错误\n");

    _p3 = (int *)&temp3;
    _p1 = (char *)&temp3;   
    _p2 = (char *)(_p3+1);
    printf("temp3.int=0x%08X\n", *_p3);
    printf("temp3.char=0x%02X\n", *_p2);
    if(*_p1==0xCD && *_p2==0x28) printf("位域类型测试:大端模式\n");
    else if(*_p1==0x1D && *_p2==0x05) printf("位域类型测试:小端模式\n");
    else printf("位域类型测试:测试错误\n");

    return 0;
}

实验结果如下:
在这里插入图片描述

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

C语言之什么是大小端,数组大小端,位域大小端,结构体大小端 的相关文章

  • OTT-TV网络电视EPG录制和EPG抓取解决方案

    EPG是Electrical Program Guide xff0c 也就是电子节目单 这个名词的出现和OTT TV或者说IPTV紧密相关 EPG功能是频道化电视以 频道 时间 方式提供一段时间内的所有电视节目信息 xff0c 实现业务浏览
  • ROS noetic 安装编译Cartographer踩坑记录

    ROS noetic 安装编译Cartographer踩坑记录 安装编译工具 span class token function sudo span span class token function apt get span update
  • 用PWM控制舵机(以是stm32为例)

    因为做校创需要用到舵机 xff0c 以前知道大致的理论 xff0c 因此看了一些帖子 xff0c 总结一下被以后查看 什么是PWM波 PWM就是脉冲宽度调制 xff0c 也就是占空比可变的脉冲波形 pwm的占空比 xff0c 就是指高电平保
  • 算法时间复杂度的计算

    一 算法时间复杂度定义 在进行算法分析时候 语句总的执行次数T n 是关于问题规模n的函数 进而分型T n 随着n的变化情况并确定T n 的数量级 算法的时间复杂度 也就是算法的时间度量记作 T n 61 O f n 它表示随着问题规模n的
  • 三角形最小路径和(JS)--自底向上解决(动态规划)

    题目描述 xff1a 给定一个三角形 xff0c 找出自顶向下的最小路径和 每一步只能移动到下一行中相邻的结点上 例如 xff0c 给定三角形 xff1a 2 3 4 6 5 7 4 1 8 3 自顶向下的最小路径和为 11 xff08 即
  • leetcode42--接雨水(JS)

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图 xff0c 计算按此排列的柱子 xff0c 下雨之后能接多少雨水 上面是由数组 0 1 0 2 1 0 1 3 2 1 2 1 表示的高度图 xff0c 在这种情况下 xff0c 可以
  • 自定义组件继承的组件基类React.Component是什么

    我们平时写React组件时都要继承一个父类 xff0c 那就是React Component 也会用到props state和setState xff0c 我们只是会使用它 xff0c 然而不知道它们怎么来的 xff0c 既要知其然也要知其
  • Java 在二维坐标系绘制矩形、圆形、多边形

    最近遇到一个需求 xff0c 大概要求是 xff1a 根据前端传递的参数 xff0c 在Java侧绘制虚拟的二维封闭图形 xff0c 判断各个图形间是否有交集 在java awt包下有个名为Shape的接口 xff0c 可以实现在二维坐标系
  • Uncaught (in promise) TypeError: Cannot read property 'data' of undefined

    最近在学习Redux的时 xff0c 自己写了个Demo xff0c 用fetch异步调用接口时返回这个脑壳疼的问题 问题 xff1a 问题排查 xff1a 一步一步在控制台打印 xff0c 并检测类型 xff0c 发现控制台打印undef
  • Ajax、fetch、axios的区别与优缺点

    背景 前端的技术发展速度非常的快 xff0c 异步请求也是其重要的体现之一 xff0c 从最早的原生XHR xff0c 再到JqueryAjax的统治时代 xff0c 再到近来 xff0c fetch axios等技术也开始出现并大量投入使
  • 什么是 Promise.allSettled() !新手老手都要会?

    什么是 Promise allSettled xff01 新手老手都要会 xff1f Promise allSettled 方法返回一个在所有给定的 promise 都已经 fulfilled 或 rejected 后的 promise x
  • 一份稳进Shopee的简历长啥样?

    小伙伴们好 xff0c 我是Eason 简历是求职流程的第一步 xff0c 是很关键的一环 Eason在做Shopee招聘工作时 xff0c 收到了投递的1000 43 的简历 xff0c 简历也修改过50多次 xff0c 最近也帮10多个
  • Vue项目中较优雅地封装Echarts

    场景 1 Echarts 1 使用时 xff0c 都需要写一堆的 option xff0c 如果每个图表都要写一个 xff0c 一个文件里面的代码量是很大的 2 不方便复用 需求 1 方便复用 2 展示类的图表 xff0c 数据与业务 样式
  • React系列--JSX到底是什么东西

    JSX 简介 JSX的全称是 Javascript and XML xff0c React发明了JSX xff0c 它是一种可以在JS中编写XML的语言 JSX更像一种模板 xff0c 类似于Vue中的 template 为什么使用JSX
  • https请求+basic认证

    目录 1 工具类 SSLClient 2 工具类HttpsClientUtil 3 使用 1 工具类 SSLClient 此类可绕过https证书 import org apache http conn ClientConnectionMa
  • 自旋锁的原理及使用

    什么是自旋锁 是指当一个线程在获取锁的时候 xff0c 如果锁已经被其它线程获取 xff0c 那么该线程将循环等待 xff0c 然后不断的判断锁是否能够被成功获取 xff0c 直到获取到锁才会退出循环 获取锁的线程一直处于活跃状态 xff0
  • 实验11 多线程

    1 设有一个银行账户 xff0c 里面有2000元钱 该账户归tom和jack两个人共同所有 每个人每 次可以取100元钱 编写一个类BankAccount表示银行账户 xff0c void withdraw int count 方法表 示
  • stm32 esp8266 ota升级-自建mqtt和文件服务器全量升级

    stm32 esp8266 ota系列文章 xff1a stm32 esp8266 ota 快速搭建web服务器之docker安装openresty stm32 esp8266 ota升级 tcp模拟http stm32 esp8266 o
  • rk1126开发板开发记录—SDK环境准备和系统烧录

    序言 最近在弄rk系列的开发板 xff0c 手上正好有一台rk1126的板子 xff0c 因为之前很少接触到嵌入式的东西 xff0c 所以在模型部署的同时遇到了很多坑 xff0c 在此期间也有很多收获 xff0c 习惯性的用文章记录一下开发
  • linux 应用层串口调试函数

    tcgetattr函数与tcsetattr函数 xff08 获取终端信息 xff09 波特率的设置通常使用cfsetospeed和cfsetispeed函数来完成

随机推荐

  • 安装MySQl 8.0遇到的问题及解决方法

    一 官网下载最新版本mysql xff0c 安装完成后 xff0c 安装SQLyog 二 在 C Program Files MySQL MySQL Server 8 0目录中查找是否存在 my ini文件 xff0c 如不存在 xff0c
  • Cmakelists.txt添加.h和.cpp文件

    文件目录结构是这样 代码都是最基本的代码 仅仅是个小的demo cmakelists txt里面的内容 span class token comment cmake的版本要求 span cmake minimum required span
  • 【tcpdump命令使用总结】

    1 tcpdump说明 linux系统的tcpdump命令用来分析数据包分析工具 xff0c 相似的工具有wireshark等 xff0c wireshark使用见 wireshark报文解析ping baidu com 执行tcpdump
  • 使用graphviz+pycallgraph绘制python调用关系图

    绘制python代码调用关系图 前言1 工具安装1 1 安装graphviz1 2 安装pycallgraph2 可视化调用关系 参考文献 前言 一个 python project 中往往包含很多 py 文件 python文件中又会包含很多
  • 用树莓派实现人脸识别打卡门禁系统

    用树莓派实现人脸识别打卡门禁系统的构建 背景功能硬件效果源码摄像头测试代码录入信息人脸识别 结论 背景 源于实习公司的人脸识别打卡系统 xff0c 完成之前的项目后正好没有事情干 xff0c 于是想到了这个 xff0c 公司的这个打卡系统操
  • 一个多功能智能小车的想法

    其实一直以来都有这个想法 xff0c 但是一直没有付出行动 xff0c 学了一些专业知识之后就有了一个想法 xff0c 制作一个智能的 xff0c 非常炫酷的并且看起来就很不普通的一个机器人 xff0c 比如像机器人总动员里的瓦力 xff1
  • “2020 博客之星”年度总评选 TOP 200 名单已出,速来认领!

    经过为期半个月的激烈角逐 xff0c 2020博客之星海选投票已正式落下帷幕 成功的程序员离不开技术之路的踽踽独行 xff0c 同时也离不开社区同盟的鼎力拥趸 以下博主们在此次票选中获得了强有力的支持 xff0c 为他们一整年的技术输出添上
  • 三自由度机械臂的三维设计

    三自由度机械臂的三维设计 背景底座设计机械臂设计关节连接方式底座与机械臂的连接方式效果 背景 写本篇文章的时候只是模型设计完成以及部分零件进行了采购 xff0c 最终是否能实现不能确定 xff0c 某些图片过于辣眼 xff0c 请多担待 继
  • 气动爬行机器人设计

    气动爬行机器人设计 简介项目规则想法原理电控原理腿部机构转向机构其他结构 结语 简介 最近在学校做一个气动的爬行机器人 xff0c 算是一个二级项目 xff0c 虽然名义上有分组 xff0c 但是基本上是我自己在做 xff0c 觉得有些东西
  • ImportError: cannot import name 'Flask'解决方法

    在写bug的时候发现了这么一个错误 xff0c ImportError cannot import name Flask xff0c 自己建一个test脚本 xff0c 代码复制过去后发现可以运行 xff0c 经检查发现脚本文件的名称可能和
  • python lambda表达式详解

    64 python lambda表达式详解 1 lambda简介 先来看一段代码示例 xff1a 第一行是lambda声明 xff0c x y相当于传入的参数 xff0c 整个函数会返回x 43 y的值 lambda作为一个表达式 xff0
  • CNN(卷积神经网络)详解

    CNN卷积神经网络详解 Why CNN局部感受野 local receptive fields 权值共享 Shared weights and biases 池化 Pooling 总的来看 Why CNN 首先回答这样一个问题 xff0c
  • mysql索引笔记 innodb null

    1 列有null 索引不失效 2 is not null 不会用索引 3 模糊查询 左边匹配 不会用索引 4 组合索引最左原则 5 设置索引 不加长度 默认长度为字段长度如varcher 255 单个索引字节不超过767 组合索引不超过30
  • Mysql避免索引失效

    要尽量避免这些不走索引的sql xff1a SELECT 96 sname 96 FROM 96 stu 96 WHERE 96 age 96 43 10 61 30 不会使用索引 xff0c 因为所有索引列参与了计算 SELECT 96
  • MySQL中的semi-join半连接

    MySQL中的semi join半连接
  • JDK8 lamdba

    1 方法调用
  • try catch finally执行顺序

    try catch finally执行顺序 内容简介代码示例执行结果 xff1a 分析 内容简介 代码中经常会在catch 或者finally中再次抛出异常 xff0c 传给调用者 xff08 如文件上传处理工具类 xff09 xff0c
  • C++中全局变量的使用

    在C 43 43 中全局变量的定义与使用做一下下面简单的记录 xff0c 方便日后查阅 xff0c 也与大家一起学习 1 全局变量的声明 1 在头文件 h中进行声明 xff0c 如果在此文件之外也要使用该变量 xff0c 则在变量声明前加e
  • mysql innodb

    mysql s sql优化 io 使用limit返回用到的字段 xff0c 不要返回太多无用字段和一些大字段 避免索引失效 创建索引 dd
  • C语言之什么是大小端,数组大小端,位域大小端,结构体大小端

    公众号 xff1a 嵌入式不难 本文仅供参考学习 xff0c 如有错误之处 xff0c 欢迎留言指正 理解大小端之前必须明白的三点 内存地址始终以字节为单位大小端只针对基本数据类型存在位域的情况下 xff0c 小端模式下先定义的位域从LSB