ARM存储格式之 大端小端

2023-05-16

开头讲个有关大端小端的故事:

  端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。在计算机业Big Endian和Little Endian也几乎引起一场战争。  

 

  我们知道在内存中数据是以字节为单位进行存储的,每个地址单元对应着一个字节(byte),一个字节为8位(bite)。但是很多时候数据除了8bit额char外,还有16bit的short,32位的long型(要看具体的编译器),必然存在多字节安排的问题。不同的计算机存放多字节值的顺序不同,有些机器在起始地址存放低位字节(低位先存),即小端模式;有的机器在起始地址存放高位字节(高位先存),即大端模式。基于Intel的CPU,采用的是低位先存。而KEIL C51则为大端模式。大端小端对应着数据在存储器中的存放顺序。

  同时,在网络传输中,网络协议需要指定网络字节顺序,TCP/IP协议中使用16位整数和32位整数的高位先存模式,对应我们的大端模式。

  下面是两个具体例子:

  16bit宽的数0x1234在Little-endian模式(以及Big-endian模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址小端模式存放内容大端模式存放内容
0x40000x340x12
0x40010x120x34

  32bit宽的数0x12345678在Little-endian模式以及Big-endian模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址小端模式存放内容大端模式存放内容
0x40000x780x12
0x40010x560x34
0x40020x340x56
0x40030x120x78

  联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。

  写程序判断处理器是Little-endian模式,还是Big-endian模式,可以通过以下程序:

  1>.通过将int强制类型转换成char单字节,通过判断起始存储位置。

1 void main(int argc, char **argv)
2 {
3 int i = 1;
4 char *cp = (char *)&i; //前面是指针运算符*,前值类型转换。后面是取地址符号。
5   if (*cp) //如果此时cp指向的内存为1的话,则为小端,否则为大端。
6   printf("Little Endian\n");
7 else
8 printf("Big Endian\n");
9
10 exit(EXIT_SUCCESS);
11 }

注释:如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1(或者为0,也即是假)来确定是不是小端。

或者如下程序:

void main()
{
short int x;

char x0,x1;

x
=0x1122;

x0
=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元

if (0x11 == x0 && 0x22 == x1)
{
cout
<< "Big_endian" << endl;
}
else
{
cout
<< "Little_endian" << endl;
}
}

2>.利用联合体union的存放顺序是所有成员都从低地址开始存放,判断处理器模式。

bool checkCPU( )
{
{
union w
{
int a;
char b;

} c;
c.a
= 1;
return(c.b ==1);
}
}

以及如下程序:

bool isLittleEndian()
{
union _dword
{
int all;
struct _bytes
{
char byte0;
char pad[3];
}bytes;
}dword;

dword.all
=0x87654321;

return (0x21==dword.bytes.byte0);
}

分析:如果你的处理器调用函数isLittleEndian返回1,那么说明你的处理器为little endian,否则为big endian.注意,如果在little endian处理器上,byte0和pad按内存从低到高的存放顺序:LOW->byte0 pad[0] pad[1] pad[2] ->HIGH;0x87654321按内存从低到高的存放顺序:  0x21  0x43   0x65   0x87, 可见byte0对应到0x21。所以通过判断dword中第一个字节dword.bytes.byte0是否与0x21相等就可以看出是否是little endian。

 

 

 PS:本文后面几个程序都是从网上摘抄过来的,对于联合体Union不是很清楚的可以参看http://blog.sina.com.cn/s/blog_3fa943920100ob37.html 我觉得这篇博文写的很详细。通过本文对大端小端模式有了一个比较深的理解吧。也希望对读者有些许帮助,谢谢!接下来我会总结下联合Union结构和Struct的区别。

转载于:https://www.cnblogs.com/yin-jingyu/archive/2011/09/30/2196110.html

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

ARM存储格式之 大端小端 的相关文章

随机推荐

  • Error "Client wants topic A to have B, but our version has C. Dropping connection."

    ROS problem 出现这个问题的原因是话题上的消息类型和订阅节点指定的消息类型不匹配 转载于 https www cnblogs com lvchaoshun p 7811123 html
  • unity利用A*算法进行2D寻路

    找了份新工作之后 xff0c 忙的要死 xff0c 都没时间鼓捣博客了 xff0c 深深的感受到资本家的剥削 xff0c 端午节连粽子都没有 xff0c 每天下班累得跟条咸鱼一样 可能就是 刚好最近忙里偷闲 xff0c 就来写写unity在
  • 工信部划分数据中心规模等级

    C114讯 2013年1月14日上午消息 为落实 国务院关于加快培育和发展战略性新兴产业的决定 xff0c 满足社会 信息化 水平不断提高的要求 xff0c 促进我国数据中心 xff0c 特别是大型数据中心的合理布局和健康发展 xff0c
  • VS2010 error RC2135: file not found

    VS2010 C 43 43 win32 DLL 工程 xff0c 添加 rc 文件 xff0c 编辑 String Table 默认情况下英文版本的 rc 文件能够顺序编译通过 xff0c 为了让工程支持多语言 xff0c 将字符串修改为
  • mavlink协议移植问题

    mavlink协议移植问题 mavlink源代码是一个代码库 xff0c 使用的时候只需要将mavlink h头文件包含到工程项目中即可 mavlink通信协议是无状态的连接 xff0c 一般采用心跳消息跟踪系统是否存在 请确保每60 30
  • 光流传感器 定位精度_光流传感器其它方面的应用

    光流传感器可以通过在一定的时间内拍摄两张不同的照片 进而计算出物体运动的速度 光流是一种简单实用的图像运动表达方式 通常定义为一个图像序列中的图像亮度模式的表观运动 光流法检测运动物体的基本原理是 xff1a 给图像的每一个像素点赋予一个速
  • 6.28-机器人模拟器Gazebo基础

    gazebo基础学习 前言 在算法人员开发出可以真机使用的算法之前进行仿真学习机器人物理仿真器的基本使用 xff0c 包括创建场景 xff0c 制作ROS控制接口等 目录 gazebo基础学习 前言 目录 参考 学习记录 基础 安装gaze
  • Poco C++库网络模块例子解析2-------HttpServer

    下面程序取自 Poco 库的Net模块例子 HTTPServer 下面开始解析代码 include 34 Poco Net HTTPServer h 34 继承自TCPServer 实现了一个完整的HTTP多线程服务器 include 34
  • 【0928 | Day 39】事务(精讲)

    目录 一 事务 1 mysql如何控制事务 xff1f 2 默认事务开启的作用是什么 xff1f 3 事务的其他打开方式 xff1f 二 事物的四大特性 一 事务 在mysql中 xff0c 事务其实是一个最小的不可分割的工作单元 xff0
  • Unity项目 - DeathtrapDungeon死亡地牢

    目录 游戏原型项目演示绘图资源代码实现注意事项技术探讨参考来源 游戏原型 死亡地牢是一款 2D Roguelike 的地牢冒险游戏 手握利刃 xff0c 斩杀怪物 xff0c 在凶险的地牢内生存下去 但注意 xff0c 敌人也并非善茬 xf
  • Unity - 存读档机制简析

    本文旨在于简要分析Unity中的两种存档机制 xff0c 即 xff1a PlayerPrefs数据持久化方法及Serialization数据序列化方法 较比于源项目 xff0c 我另加了JSON方法 XML方法等及一些Unity设置 xf
  • Windows 无法安装到所选位置。错误:0x80300001

    Windows 无法安装到所选位置 错误 xff1a 0x80300001 这里遇到的情况是这样的 xff0c iDrac安装windows 2008 R2 xff0c 一开始映射 windows 2008 R2系统镜像 xff0c 后来
  • 【udacity】机器学习-2模型验证

    Evernote Export 1 模型的评估与验证简介 机器学习通常是大量传入数据 xff0c 然后会有一些关于数据的决策 想法和摘要 2 模型评估 评估模型使用的是各种数据分析的方法 xff0c 至少需要使用python编程和一些统计学
  • C++编程(五)--- Cmake详解&Makefile详解

    C C 43 43 程序员肯定离不开Makefile和Cmake xff0c 因为如果对这两个工具不熟悉 xff0c 那么你就不是一个合格的C C 43 43 程序员 本文对Makefile和Cmake xff0c 及它们的使用进行了详细的
  • 【统计学】第四章

    Evernote Export 一组数据的分布特征可以从那几个方面进行测度 xff1f 数据的分布特征可以从三个方面进行测度和描述 xff0c 一是分布的集中趋势 xff0c 反映各数据向其中心值靠拢或聚集的程度 xff1b 二是分布的离散
  • UG NX安装包大集合(包括UG目前发布的所有版本)

    UG NX安装包大集合 xff08 包括UG目前发布的所有版本 xff09 UG爱好者官方交流群 216953883 有了这个你就不怕找UG安装包麻烦了 xff0c 现在所有安装包全在这里了 所有版本的补丁包也在年后陆续更新 提醒 xff1
  • HTML常用字体代码

    HTML常用字体代码 常用字体 lt FONT style 61 34 FONT SIZE 40pt FILTER shadow color 61 green WIDTH 100 COLOR white LINE HEIGHT 150 FO
  • 线性链式存储结构c语言建立,线性表的链式存储结构(C语言版)

    上一篇博文我对数据结构中线性表的顺序存储结构顺序表 http 12172969 blog 51cto com 12162969 1916336 按照我的理解做了总结 xff0c 今天我继续对顺序表的另一种存储结构 xff0c 链表谈一下我看
  • stract oracle,ORACLE 字符串聚合函数 strCat

    源码如下 xff1a create or replace type strcat type as object currentstr varchar2 4000 currentseprator varchar2 8 static funct
  • ARM存储格式之 大端小端

    开头讲个有关大端小端的故事 xff1a 端模式 xff08 Endian xff09 的这个词出自Jonathan Swift书写的 格列佛游记 这本书根据将鸡蛋敲开的方法不同将所有的人分为两类 xff0c 从圆头开始将鸡蛋敲开的人被归为B