精华内容
下载资源
问答
  • 大端和小端模式的区别
    2020-04-14 19:31:58
    1. 背景

      1. 在内存中一个地址存储一个字节(Byte)的数据,即8位。
      2. 一个int型数据有32位,需要占用4Byte的空间,那么应该怎么存储int的数据呢?是高位先存储还是低位先存储?因此产生了两种不同的模式,即大端模式和小端模式。
    2. 是什么

      1. 大端模式:高位先存,数据的高位(即大端)存在低地址;
      2. 小端模式:低位先存,数据的低位(即小端)存在低地址。
    3. 举例子
      例如:int temp = 0xAABBCCDD; // 假设存储在地址0x1000;

      • 大端模式:
        0x1000 0xAA;
        0x1001 0XBB;
        0x1002 0xCC;
        0x1003 0XDD;
      • 小端模式:
        0x1000 0xDD;
        0x1001 0XCC;
        0x1002 0xBB;
        0x1003 0XAA;
    4. 怎么知道当前系统是大端模式还是小端模式?
      测试方法:使用union来测试大小端模式。代码如下:

    bool checkSystem()
    {
      union check
      {
          int i;
          char ch;
      } chk;
      chk.i = 1;
      return (chk.ch==1);//如果是大端模式,返回false;如果是小端模式,函数返回true。
    }
    
    更多相关内容
  •  在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。  先回顾两个关键词,MSB和LSB:  MSB:Most Significant Bit ------- 最高有效位 LSB:Least ...
  • 一、什么是大端和小端 Big-Endian和Little-Endian的定义如下: Little-Endian就是低位字节排放在内存的低地址,高位字节排放在内存的高地址。 Big-Endian就是高位字节排放在内存的低地址,低位字节排放在内存...

    一、什么是大端和小端

    Big-Endian和Little-Endian的定义如下:

    1. Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
    2. Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

    举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:

    1)大端模式:

    低地址 -----------------> 高地址
    0x12 | 0x34 | 0x56 | 0x78

    2)小端模式:

    低地址 ------------------> 高地址
    0x78 | 0x56 | 0x34 | 0x12
    可见,大端模式和字符串的存储模式类似。

    3)下面是两个具体例子:

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

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

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

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

    4)大端小端没有谁优谁劣,各自优势便是对方劣势:

    小端模式 :强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
    大端模式 :符号位的判定固定为第一个字节,容易判断正负。

    三、数组在大端小端情况下的存储:

    以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:

    Big-Endian: 低地址存放高位,如下:
    高地址
    ---------------
    buf[3] (0x78) – 低位
    buf[2] (0x56)
    buf[1] (0x34)
    buf[0] (0x12) – 高位
    ---------------
    低地址

    Little-Endian: 低地址存放低位,如下:
    高地址
    ---------------
    buf[3] (0x12) – 高位
    buf[2] (0x34)
    buf[1] (0x56)
    buf[0] (0x78) – 低位
    --------------
    低地址

    四、为什么会有大小端模式之分呢?

    这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

    五、如何判断机器的字节序

    可以编写一个小的测试程序来判断机器的字节序:

    BOOL IsBigEndian()  
    {  
        int a = 0x1234;  
        /*通过将int强制类型转换成char单字节,通过判断起始存储位置。
        即等于 取b等于a的低地址部分*/
        char b =  *(char *)&a;    
        if( b == 0x12)  
        {  
            return TRUE;  
        }  
        return FALSE;  
    }
    

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

    BOOL IsBigEndian()  
    {  
    	union NUM  
    	{  
    		int a;  
    		char b;  
    	}num;  
    	num.a = 0x1234;  
    	if( num.b == 0x12 )  
    	{  
    		return TRUE;  
    	}  
    	return FALSE;  
    }
    
    展开全文
  • 但是,大多数情况下,数据不是按照单字节的方式存储的,例如会有类似于int,double等数据类型,这就涉及到存储顺序的问题了,于是也就出现了两种存储方:大端模式(big endian)和小端模式(little endian)。

    1. 为什么会有大端模式和小端模式

    在计算机中,我们知道数据是按照字节存储的,如果数据都是单字节存储,就不涉及存储顺序的问题。但是,大多数情况下,数据不是按照单字节的方式存储的,例如会有类似于int,double等数据类型,这就涉及到存储顺序的问题了,于是也就出现了两种存储方:大端模式(big endian)和小端模式(little endian)

    我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。

    2. 大端模式与小端模式的存储方式

    • 大端模式(顺序):高字节在前(高字节存放在地址的低端),低字节在后
    • 小端模式:高字节在后,低字节在前
    • 大端模式的优点:符号位的判定固定为第一个字节,容易判断正负
    • 小端模式的优点:强制转换数据不需要调整字节内容

    2.1 举例说明一

    以0x1234为例进行说明。

    地址0x4000(低地址)0x4001(高地址)
    大端存储0x120x34
    小端存储0x340x12

    2.2 举例说明二

    下面来看看数组在大端模式和小端模式的存储区别,以unsigned int value = 0x12345678进行说明,假设有unsigned char buf[4]的一个数组。

    • 大端模式

    buf[3] (0x78) – 高地址,存放低位(字节)
    buf[2] (0x56)
    buf[1] (0x34)
    buf[0] (0x12) – 低地址,存放高位(字节)

    低地址 -----------------> 高地址
    0x12 | 0x34 | 0x56 | 0x78

    • 小端模式

    buf[3] (0x12) – 高地址,存放高位(字节)
    buf[2] (0x34)
    buf[1] (0x56)
    buf[0] (0x78) – 低地址,存放低位(字节)

    低地址 ------------------> 高地址
    0x78 | 0x56 | 0x34 | 0x12

    可见,大端模式和字符串的存储模式类似。

    3. 用代码判断大端和小端

    3.1 union判断

    使用union类型共享内存的判断方法。联合体union的存放顺序是所有成员都从低地址开始存放

    bool IsBigEndian()
    {
        union
        {
            unsigned short a ;//2个字节
            char b ;//高地址
        } c;
    
        c.a =0x0102 ;
    
        if(c.b ==1)//如果高地址存放低字节
            return true ;
        else
            return false ;
    }
    

    3.2 int判断法

    直接取int类型的高地址

    bool IsBigEndian()
    {
        int a =1 ; 
        if(((char*)&a)[3] ==1)//直接取高地址
            return true ;
        else
            return false ;
    }
    

    4. Intel格式与Motorola格式

    在进行CAN总线通信设计或者测试过程中,经常看到CAN总线信号的编码格式有两种定义:Intel格式与Motorola格式。Motorola是大端字节序,Intel是小端字节序

    4.1 CAN报文

    CAN总线上有4种报文:数据帧、远程帧、错误帧、超载帧。其中只有数据帧真正承载数据。假设报文中含有8各字节的数据,共8*8 = 64 bit

    • 如果位编号从右至左(R2L),那么:
     7   6   5   4   3   2   1   0
    --------------------------------
                                    | 0
                                    | 1
                                    | 2
                                    | 3
                                    | 4
                                    | 5
                                    | 6
                                    | 7
    
    • 如果位编号从左至右(L2R),那么:
     0   1   2   3   4   5   6   7
    --------------------------------
                                    | 0
                                    | 1
                                    | 2
                                    | 3
                                    | 4
                                    | 5
                                    | 6
                                    | 7
    

    这两种编号方式中,字节的编号是一样的,位的编号不同。CAN报文是串行发送的,CAN节点在发送报文时,不论如何编号,总是从表的左上第一位开始发送。从左至右,从上至下

    4.2 Intel格式与Motorola格式排列

    使用<或者>表示信号的衔接点。

    • Intel格式

    Intel格式的信号的每位,从MSB(高字节)到LSB(低字节),按照从右至左,从上至下的顺序排列(向右上角塞)

     x   x   x   x   x   x   x   x
    --------------------------------
    >.. ... ... ... ... ... ... MSB | 0
                    LSB ... ... ..> | 1
                                    | 2
                                    | 3
                                    | 4
                                    | 5
                                    | 6
                                    | 7
    
    • Motorola格式

    而Motorola格式的信号,从MSB(高字节)到LSB(低字节),按照每位从左至右,从上至下排列(向左上角塞)

     x   x   x   x   x   x   x   x
    --------------------------------
    MSB ... ... ... ... ... ... ..< | 0
    <.. ... ... LSB                 | 1
                                    | 2
                                    | 3
                                    | 4
                                    | 5
                                    | 6
                                    | 7
    

    从上面可以看出,Motorola格式对can报文的解析更加友好。

    5. 大端数据解析示例

    在这里插入图片描述
    解析方法:
    在这里插入图片描述
    以速度为例,如果速度为负值,需要对speed或0xF800,因为要取反+1,对不需要的数据补上1,防止对要解析的数据造成影响。如果是满字节,不管正数还是负数,也就无所谓补1了

    //目标信息结构体
    typedef struct
    {
        uint64_t snr      :  8;  //SNR
        uint64_t dynProp  :  3;  //运动状态
        uint64_t resv     :  2;
        uint64_t latVel   :  9;  //横向速度
        uint64_t angle    : 10;  //角度
        uint64_t velocity : 11;  //速度
        uint64_t range    : 13;  //距离
        uint64_t objId    :  8;  //目标ID
    }stObjInfoMsg;
    
    //buf为待解析的8个字节
    uint8_t * ptr = (uint8_t *)(buf);
      uint64_t msgdata = ((uint64_t)ptr[0] << 56) | ((uint64_t)ptr[1]   << 48)
                        | ((uint64_t)ptr[2] << 40) | ((uint64_t)ptr[3]   << 32)
                        | ((uint64_t)ptr[4] << 24) | ((uint64_t)ptr[5]   << 16)
                        | ((uint64_t)ptr[6] << 8)  | ((uint64_t)ptr[7]   << 0);
      stObjInfoMsg *pMsg = (stObjInfoMsg *)&msgdata;
    
      m_ID = pMsg->objId;
      m_Range = (float)pMsg->range / 5;
      m_Speed = pMsg->velocity & 0x400 ? (float)((int16_t)(pMsg->velocity | 0xF800)) / 5
                                                  : (float)((int16_t)(pMsg->velocity & 0x3FF)) / 5;
      m_Angle = pMsg->angle & 0x200 ? (float)((int16_t)(pMsg->angle | 0xFC00)) / 4
                                              : (float)((int16_t)(pMsg->angle & 0x1FF)) / 4;
    
    展开全文
  • 详解大端模式和小端模式详解大端模式和小端模式Danny Cohen一位网络协议的开创者,第一次使用这两个术语指代字节顺序,后来就被大家广泛接受。一、大端模式和小端模式的起源关于大端小端名词的由来,有一个有趣的...
  • 小端模式(little endian):数据的高位字节保存在内存的高地址中,而低位字节保存在内存的低地址中。 问:什么是高位字节?什么是低位字节? 答:例如:123456 1为最高位字节,下来是2,3,4,5,最后才是6.,为最低字节...

    1.概念

    大端模式(big endian):数据的高位字节保存在内存的低地址中,而低位字节保存在内存的高地址中。

    小端模式(little endian):数据的高位字节保存在内存的高地址中,而低位字节保存在内存的低地址中。

    问:什么是高位字节?什么是低位字节?
    答:例如:123456
    1为最高位字节,下来是2,3,4,5,最后才是6.,为最低字节。

    2.下面的图可以清晰理解

    0x12345678在两种不同字节序的cpu中的存储顺序。
    如下图所示:
    在:这里插入图片描述

    3.如何判断机器的大小端呢?

    #方法:利用字节序的存储特性来判断
    代码如下:

    #define _CRT_SECURE_NO_WARNINGS
    #include<iostream>
    using namespace std;
    int main()
    {
    	int num = 1;
    	char chData = *(char*)(&num);//取num的地址,强转为单字节char后解引用
    	if (chData == 1)
    	{
    		cout << "It's little endian!" << endl;
    	}
    	else
    	{
    		cout << "It's big endian!" << endl;
    	}
    	system("pause");
    	return 0;
    }
    

    主要原理是获取 x 的最低字节,为0x00,说明是大端;为0x01,说明是小端。

    在这里插入图片描述

    展开全文
  • 大端和小端区别

    千次阅读 2016-10-22 16:24:33
    简单介绍了计算机数据存储、网络传输时数据的存储与地址的关系,即简要对小端存储和大端存储进行了介绍。
  • 677-大端模式和小端模式详解

    千次阅读 2021-10-13 23:05:34
    1、大端和小端核心是什么? 大端模式和小端是实际的字节顺序和存储的地址顺序对应关系的两种模式,总结如下: 大端模式:低地址对应高字节 小端模式:低地址对应低字节 不管是大端还是小端模式,我们在读取和存储...
  • 大端模式和小端模式

    2022-08-14 22:06:34
    大端模式与小端模式
  • 大端模式与小端模式

    千次阅读 2021-12-08 15:29:54
    端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这样的存储模式有点儿类似于把数据... 主机字节序有大端模式和小端模式,根据不同的主机来决定。 Linux使用的是小端模式。 ...
  • 大端模式和小端模式的记忆方法
  • 大端模式和小端模式的转换

    千次阅读 2022-03-16 19:30:55
    大端模式和小端模式的转换
  • 栈的四种方式 根据栈指针指向,可分为满(Full)/空(Empty): ...大端小端模式 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字
  • 深刻理解大端模式与小端模式的概念,但我们如何判别当前系统为大端模式还是小端模式呢?
  •  端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile ...
  • 大端和小端区别-linux

    2021-05-16 14:13:23
    记忆方法:小端:低地址存放低位;大端高地址存放低位。(顺,大逆)先解释一下?高地址、低地址:这个很明显,地址大则是高地址,地址则是低地址。低位、高位:从int型分析:0x00 12 34 56;从数据大小来判断,从...
  • 大端小端模式

    千次阅读 2021-02-19 23:37:29
    大端小端模式 一、什么是大小端模式 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由向大增加,而数据从高位...
  • 大端模式和小端模式【YC】小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。下面这段...
  • 大端模式和小端模式通俗说明

    千次阅读 2020-02-25 22:20:17
    大端模式和小端模式 这两个模式我们经常听说,平时的协议里面也经常看见这两个词语,这两个词语主要是用来说明字节的排序方式的。 大端模式 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在...
  • 目录段模式(Little Endian)大端模式(Big Endian)C51使用大端模式STM32使用段模式使用代码验证大小端模式 在大多数微处理器架构中,在一个地址单元仅存储一个字节(8bit)的数据。大部分的数据类型(比如uint...
  • 大端存储和小端存储区别

    千次阅读 2021-01-23 14:32:02
    端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian...
  • 1、在编程开发过程中必须要知道你的MCU是大端模式还是小端模式。 2、通过以下代码就能轻松知道是大端模式还是小端模式。 3、废话不多说,直接上代码。 #include "stdio.h" #include "./usart/usart.h" #define ...
  • 大端存储和小端存储的区别

    千次阅读 2021-07-30 10:09:45
    小端存储:数据的低字节存储在内存低地址,数据的高字节存储在内存高地址。---典型CPU:inter X86系列 例如要存储一个32位的unsgiend int型的变量vol=0x12345678,两种不同存储模式如下: 地址偏移量 大端存储 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,882
精华内容 8,352
热门标签
关键字:

大端和小端模式的区别