精华内容
下载资源
问答
  • 操作系统大小端模式
    千次阅读
    2018-07-19 21:45:30

    存储模式:
    小端:较的有效字节存储在较的存储器地址,较的有效字节存储在较的存储器地址。
    大端:较的有效字节存储在较的存储器地址,较的有效字节存储在较的存储器地址


     

    STM32 属于小端模式,简单地说:比如:temp=0X12345678;假设temp的地址为:0X4000 0000
    那么,在内存里面,其存储就变成了:
    |       地址                           |    HEX                       |
    |0X4000 0000                    |    78 56 34 12           |


    更为简单一点:
    低地址---------->高地址大端模式

    数据高位------->数据低位
    0X12|0X34|0X56|0X78|


    低地址---------->高地址小端模式

    数据低位-------->数据高位
    0X78|0X56|0X34|0X12|

    大端与小端的优势
    二者无所谓优势,无所谓劣势,各自优势便是对方劣势
    大端模式:符号位的判定固定为第一个字节,容易判断正负。
    小端模式:强制转换数据不需要调整字节内容,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处理器还可以由硬件来选择是大端模式还是小端模式。

    字节序:【一般操作系统都是小端,而通讯协议是大端的
    常见CPU字节序
    Big Endian : PowerPC、IBM、Sun
    Little Endian : x86、DEC
    ARM既可以工作在大端模式,也可以工作在小端模式



     

    更多相关内容
  • 操作系统之大端小

    千次阅读 2020-08-03 18:30:57
    为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看

    1. 什么是大端,什么是小端:

    所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

    所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。(大部分的操作系统都是小端,而通讯协议是大端)

    2.为什么会有大小端:

    为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为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处理器还可以由硬件来选择是大端模式还是小端模式。

    3.大小端在内存中的存放方式举例:

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

     

     

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

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

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

    可以看出来小端模式,读取内存就可以得到相应数字,无需调整结构,而大端需要调整结构,但是大端可以最先读到正负符号,快速得知该数字是正数还是负数。

    验证一下~:

    #include <iostream>
    using namespace std;
    
    void IsBigEndian()
    {
            int a = 0x1234;
            char b =  *(char *)&a;  //通过将int强制类型转换成char单字节,通过判断起始存储位置。即等于 取b等于a的低地址部分
            if( b == 0x12)
            {
               cout<<"big endian"<<endl;
               return;
            }
            cout<<"small endian"<<endl;
            return;
    }
    
    int main()
    {
     IsBigEndian();
    }

     

     

    4.扩展

    【大端(Big Endian)与小端(Little Endian)简介】
    Byte Endian是指字节在内存中的组织,所以也称它为Byte Ordering,或Byte Order。
         对于数据中跨越多个字节的对象, 我们必须为它建立这样的约定:


    (1) 它的地址是多少?
    (2) 它的字节在内存中是如何组织的?


        针对第一个问题,有这样的解释:
        对于跨越多个字节的对象,一般它所占的字节都是连续的,它的地址等于它所占字节最低地址。(链表可能是个例外, 但链表的地址可看作链表头的地址)。
        比如: int x, 它的地址为0×100。 那么它占据了内存中的Ox100, 0×101, 0×102, 0×103这四个字节(32位系统,所以int占用4个字节)。
        上面只是内存字节组织的一种情况: 多字节对象在内存中的组织有一般有两种约定。 考虑一个W位的整数。
        它的各位表达如下:[Xw-1, Xw-2, ... , X1, X0],它的
        MSB (Most Significant Byte, 最高有效字节)为 [Xw-1, Xw-2, ... Xw-8];
        LSB (Least Significant Byte, 最低有效字节)为 [X7,X6,..., X0]。
        其余的字节位于MSB, LSB之间。

     

    LSB和MSB谁位于内存的最低地址, 即谁代表该对象的地址?
    这就引出了大端(Big Endian)与小端(Little Endian)的问题。
    如果LSB在MSB前面, 既LSB是低地址, 则该机器是小端; 反之则是大端。
    DEC (Digital Equipment Corporation,现在是Compaq公司的一部分)和Intel的机器(X86平台)一般采用小端。
    IBM, Motorola(Power PC), Sun的机器一般采用大端。
    当然,这不代表所有情况。有的CPU即能工作于小端, 又能工作于大端, 比如ARM, Alpha,摩托罗拉的PowerPC。 具体情形参考处理器手册。
    具体这类CPU是大端还是小端,应该和具体设置有关。
    (如,Power PC支持little-endian字节序,但在默认配置时是big-endian字节序)
    一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是Little Endian的。少部分,如MAC OS ,是Big Endian 的。
    所以说,Little Endian还是Big Endian与操作系统和芯片类型都有关系。

    Linux系统中,你可以在/usr/include/中(包括子目录)查找字符串BYTE_ORDER(或
    _BYTE_ORDER, __BYTE_ORDER),确定其值。BYTE_ORDER中文称为字节序。这个值一般在endian.h或machine/endian.h文件中可以找到,有时在feature.h中,不同的操作系统可能有所不同。

    对于一个数0×1122
    使用Little Endian方式时,低字节存储0×22,高字节存储0×11
    而使用Big Endian方式时, 低字节存储0×11, 高字节存储0×22

    经一网友指正,才知道,上面的描述,是不准确的.

    想了下,觉得如下描述可能更合适:

    使用Little Endian方式存储数据时,数据的LSB相对最没意义的数据位,存放在低地址位置,这里的LSB也就是22了.也即,

    低地址存储0×22, 高地址存储0×11

    而使用Big Endian方式存储数据时,数据的MSB最有意义的数据位,存放在低地址位置,这里的MSB也就是11了.也即

    低地址存储0×11, 高地址存储0×22

    助记:

    1)所谓MSB (Most Significant Byte),名字很复杂,不知是否有人没搞懂,反正我开始看到这个词时候,就很糊涂,有点不完全理解.其实简单说MSB就是,一个数字中,最重要的那位,

    举例来说,12004,中文读作,一万两千零四,那最高位的1,就表示了一万,此处就称作MSB,最有意义的位.

    2)一般常见的数据存储,用文字写出来的时候,其内容书写格式,多数是从低地址到高地址.(更符合人类思维的原因)

    举例,一个16进制数是 0×11 22 33, 而存放的位置是

    地址0×3000 中存放11

    地址0×3001 中存放22

    地址0×3002 中存放33

    连起来就写成地址0×3000-0×3002中存放了数据0×112233.

    而这种存放和表示方式,正好符合大端.

    展开全文
  • 有读者问了这么一个问题:大小端与编译器和操作系统有关吗? 其实大小端主要由CPU决定,与编译器、操作系统这些没有直接关系。 因为我以前学习的时候,有很长一段时间也是存在这样的疑问。我觉得应该还有很多人都...

    有读者问了这么一个问题:大小端与编译器和操作系统有关吗?

    其实大小端主要由CPU决定,与编译器、操作系统这些没有直接关系。

    因为我以前学习的时候,有很长一段时间也是存在这样的疑问。我觉得应该还有很多人都没搞明白,所以,今天来分享一下相关内容。

    一、关于大小端

    大小端也可以理解为字节顺序,或者端序、尾序,也就是你们看到的大端序(Big-Endian)、小端序(Little-Endian)。

    关于大小端的解释网上很多教程,也不难理解。

    大端模式:是指数据的高字节保存在内存的低地址中;

    小端模式:是指数据的高字节保存在内存的高地址中;

    大小端模式:

    https://baike.baidu.com/item/大小端模式/6750542

    字节顺序:

    https://zh.wikipedia.org/wiki/字节序

    也可以参看我之前分享过的文章:你真的懂CPU大小端模式吗?

    二、CPU是大小端存储的决定因素

    可能部分初学者被一些外界信息给误导,从而有这样的疑惑。

    比如:

    操作系统是大端还是小端存储?

    Keil C51是大端模式,认为与编译器有关。

    你了解大小端之后,你会发现,大小端主要有用于存储的顺序,与存储器(硬件)关系比较大,编译器和操作系统仅仅是配合CPU编译好相应的代码,而不是决定大小端的因素

    三、ARM大小端模式

    ARM处理器默认是小端模式,但它是支持大端模式。

    我们在Cortex-M3手册中有这么一些描述:在Cortex-M3中, 存储器系统支持 both 小端配置和大端配置。

    Cortex-M3 支持 both 小端模式和大端模式。但是,单片机其它部分的设计,包括总线的连接,内存控制器以及外设的性质等, 一定要先在单片机的数据手册上查清楚可以使用的端。在绝大多数情况下,基于 CM3 的单片机都使用小端模式。为了避免不必要的麻烦,基本清一色地使用小端模式。

    归根结底,ARM的大小端模式还是与CPU有关,而与编译器和操作系统没有直接关系。

    免责声明:本文部分素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

    ‧  END  

    展开全文
  • 正确区分大小端模式

    千次阅读 2020-03-18 15:38:52
    正确区分大小端模式 嵌入式开发经常会遇到大小端的问题,往往学习后,过一段时间就又忘记了,这里总结一下,希望给大家留下深刻的记忆。 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端...

    正确区分大小端模式

    嵌入式开发经常会遇到大小端的问题,往往学习后,过一段时间就又忘记了,这里总结一下,希望给大家留下深刻的记忆。

    字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端和大端两种字节顺序,这两种你只需要深刻地记住其中的一种就可以,另一种恰好和它相反,不需要刻意记忆了,那么我们就记住“大端模式”吧。

    大端模式(Big-Endian):是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。

    说明:通常数据在内存中的存储是按照内存地址由低地址到高地址的顺序存储的,大端模式有点儿类似于把数据看做是一个字符串,然后按照字符串从左到右的顺序来存储,地址由小向大增加,而数据从高位往低位放,数据的存储方向和我们的阅读习惯(方向)一致。

    小端模式(Little-Endian):是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。数据的存储方向和我们的阅读习惯(方向)不一致。

    例子如下:

    初学者往往被一些信息误导,而有这样的疑惑,例如:操作系统是大端还是小端存储?编译器是大端还是小端编译?CPU是大端还是小端?

    其实,大小端主要有用于存储的顺序,与存储器(硬件)关系比较大,编译器和操作系统仅仅是配合CPU编译好相应的代码,而不是决定大小端的因素,因此大小端模式还是与CPU有关,而与编译器和操作系统没有直接关系。

    如何判断大小端模式

    大小端的判断方法很多,比较直观的是利用强制类型转换来判断,我们需要定义一个字节长度的指针,例如char型指针,指向int型的低位地址,同时需要将int型数据强制转换为char型的数据。

    void FunJudge(void)

    {

        int i = 0x12345678;

        char *p,ch;

        i = 0x12345678;

        ch = (char)i;          /* 强制类型转换成char型,将取低位地址存储的数据 */

        p = &ch;

        if(*p == 0x12)        /* 低位地址存储的是数据的高位字节,则为大端 */

        {

            printf("大端模式\n");

        }

        else

        {

            printf("小端模式\n");

        }

    }

    大小端的相互转换

    通过前面的学习,我们知道大小端模式与CPU有关,在进行系统移植的时候,由于使用的硬件平台不同,因此就需要进行大小端模式的转化。

    下面举例说明如何进行大小端模式的转换。

    例:原数据为0x12345678是按照大端模式存放的,现在需要转化为小端模式。

    一、利用宏定义形式实现

    #include "stdio.h"

    #define CONVERT(x) (((x&0xff)<<24)|((x&0xff00)<<8)|((x&0xff0000)>>8)|((x&0xff000000)>>24))       

    说明:

    1、利用C语言的按位与、按位左移和按位右移来实现

    2、x表示被转换的数据,例如这里的0x12345678是被转化数据。

    3、转换前四个字节的排列顺序要弄清楚

    二、利用函数形式实现

    void ConvertToLittle(int x)
    {
        char a,b,c,d;

        /* 将数据的每一个字节取出分别保存到4个变量中 */

        a = (char)(x&0xff);

        b = (char)((x&0xff00)>>8);

        c = (char)((x&0xff0000)>>16);

        d = (char)((x&0xff000000)>>24);

        /* 将4个字节的数据分别移动不同的位数,组合成新的数据 */
        x = (a<<24)|(b<<16)|(c<<8)|d;
        printf(“transfered x is 0x%x\n”,x);
    }

    /* 通过main函数来验证2种方式的转换 */

    int main()
    {
        int num;
        printf(“please input the number:\n”);
        scanf(“%d”,&num);
        printf(“The number you input is 0x%x\n”,num);
        ConvertToLittle(num);
        printf(“macro transfered: 0x%x\n”,CONVERT(num));
    }

    总结:通过以上2种方法实现了大端模式到小端模式的转换,小端模式转换为大端模式也是一样的,这里不做详细说明。

    展开全文
  • 最简单判断系统大小端

    千次阅读 2016-09-19 17:33:38
    大端:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。(CPU对操作数的存放方式是从高字节到低字节) 小端:低位字节排放在... //小端模式:低地址存低字节 //大端模式:低地址存高字节 int temp ...
  • 大端小存储模式详解及判断方法

    千次阅读 2021-08-04 10:23:42
    文章目录大小端模式的概念两种模式出现原因两种模式的优劣大小端的应用情景判断机器的字节序 大小端模式的概念 当我们查看数据在内存中的存储情况时,我们经常会发现一个很奇怪的现象,什么现象呢? int main() { ...
  • 编程判断大小端(c语言源码)

    千次阅读 2022-07-17 13:50:45
    是大端还是小端主要取决于CPU,而与操作系统和编译器无关! 大端模式:数据的高字节存储在内存的低地址,低字节存储在内存的高地址; 小端模式:数据的高字节存储在内存的高地址,低字节存储在内存的低地址。 我一般...
  • 你真的懂CPU大小端模式吗?

    千次阅读 2019-08-15 20:30:02
    关注、星标公众号,不错过精彩内容通信协议中的数据传输、数组的存储方式、数据的强制转换等这些都会牵涉到大小端问题。CPU的大端和小端模式很多地方都会用到,但还是有许多朋友不...
  • 详解大端模式和小端模式

    千次阅读 2021-06-04 04:12:41
    事实上,真正的理解大小端模式的区别,必须要从系统的角度,从指令集,寄存器和数据总线上深入理解,大小端模式的区别。 九、从系统的角度理解端模式 先补充两个关键词,MSB和LSB: MSB:MoST Significant Bit ------...
  • 大小端模式 & 字节序

    千次阅读 2016-12-14 20:17:25
    大、小端模式的说法,来自乔纳森·斯威夫特的小说《格列夫游记》,在小人国内部分裂成 Big-endian 和 Little-endian 两派,他们的争论在于一派要求从鸡蛋的大头把鸡蛋打破,另一派要求从鸡蛋的小头把鸡蛋打破。...
  • ntohs、ntohl、htons和htonl大小端CPU大小端之分常见字节序ntohs、ntohl、htons和htonl含义Linux系统下定义Windows系统下ntohs()htons()htonl()和ntohl()IP地址格式转换函数inet_aton、inet_addr、inet_ntoa函数(已...
  • 大小端详解(判断+转换)

    万次阅读 多人点赞 2019-04-25 00:14:46
    所谓的小端模式,就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 简单来说:大端——高尾端,小端——低尾端 举个例子,比如数字 0x12 34 56 78在内存中的表示形式为: 1)大端模式: 低地址 ---...
  • 数字的计算机表达--大小端和浮点数

    千次阅读 2022-03-10 19:47:26
    大端和小 起源 关于大端小名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法...
  • 先来简单的讲下什么是大小端模式,以及两个模式的区别:所谓大小端模式就是存储数据时,数据的高低位怎么存储在地址的高低位上。(位指的是bit,一个char类型数据有8位) 大端模式:数据的高位,存放在地址的低位。...
  • 大小端模式

    千次阅读 2013-03-15 11:00:10
    为什么有大小端模式之分 因为在计算机系统中,是以字节为单位的,一个地址单元对一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器)。另外,...
  • 00. 目录 文章目录00. 目录01. 概述02. 示例分析03....小端模式(Little-endian):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端,即逆序排列,低尾端; 例(无论是小端模式还是...
  • 文章目录什么是大小端大小端操作系统有关嘛如何判断大小端方法一方法二 什么是大小端 大小端也可以理解为字节顺序,或者端序、尾序,就是大端序(Big-Endian)、小端序(Little-Endian)。 1.大端模式:是指数据...
  • 为什么会有大小端模式之分呢?

    千次阅读 2014-06-13 10:54:36
    这是因为在计算机系统中,我们是以字节为单位的, 每个地址单元都对应着一个字节,一个字节为8bit。 但是在C语言中除了8bit的char之外,还有16bit的short型, ...因此就导致了大端存储模式和小
  • 大小端模式及其判断

    千次阅读 2016-11-23 21:12:50
    计算机领域讨论的大小端,其实就是存储系统存放数据的方式
  • 大端模式和小端模式

    万次阅读 多人点赞 2018-08-28 17:09:25
    端模式(Little-endian):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端,即逆序排列,低尾端; 例(无论是小端模式还是大端模式。每个字节内部都是按顺序排列): 1)大端模式: 低地址 ------...
  • python判断系统大小端

    千次阅读 2016-12-08 18:45:51
    def check_sys(): import struct val = 0x12345678 pk = struct.pack('i',val) hex_pk = hex( ord(pk[0]) ) if hex_pk == '0x78': print '小' elif hex_pk == '0x12': print '大端'
  • 转自 https://blog.csdn.net/ce123_zhouwei/article/details/6971544详解大端模式和小端模式一、大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:...
  • 使用C语言程序判断当前系统大小端

    千次阅读 2017-11-22 22:47:58
    我们首先的了解什么是小端模式,什么是大端模式(其实自己也不太懂,相互学习喽) 1>小端模式: 小端模式是指数据的低字节保存在地址的低地址中,而数据的高字节保存在内存的高地址中,跟我们的逻辑思维是比较一致的...
  • 大小端详解

    千次阅读 2020-02-08 17:05:39
    四、为什么会有大小端模式之分呢? 五、如何判断机器的字节序 六、常见的字节序 七、如何进行转换 八、从软件的角度理解端模式 九、从系统的角度理解端模式 十、实际中的例子 一、大端模式与小端模式的起源 ...
  • 大小端设备对程序的影响

    千次阅读 2019-01-05 00:51:21
    设备大小端模式的概念: 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;...
  • 操作系统(OS) 笔记根据B站王道计算机考研——操作系统视频整理所得,视频链接:https://b23.tv/0I2qex 视频中所用课件:链接:https://pan.baidu.com/s/101bFWm0Tv0emNpEneidYPA 提取码:y3dd 1.计算机...
  • 如何确认系统是采用大端还是小

    千次阅读 2019-11-18 23:02:29
    1、大小端 **大端(存储)模式:**是指一个数据的低位字节序的内容放在高地址处,高位字节序存的内容放在低地址处。 如:一个数0x12345678存放在一个4字节空间里 **小端(存储)模式:**是指一个数据的低位字节序...
  • 单片机存储中的大小端模式

    千次阅读 2016-06-02 12:07:03
    为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的...
  • struct 字节对齐详解与大小端模式

    千次阅读 2015-04-02 14:17:57
    比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那 么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 217,361
精华内容 86,944
热门标签
关键字:

操作系统大小端模式