精华内容
下载资源
问答
  • 代码测试CPU大端端模式

    千次阅读 2018-09-15 22:18:05
    ,由于寄存器宽度大于一个字节,如何安排多个字节的存储(字节序),这就有了大端存储模式和端存储模式 字节序:大于一个字节类型的 数据在内存中的存放顺序 ,在跨平台以及网络程序中需要注意 分类: a) ...

    参考:https://blog.csdn.net/hackbuteer1/article/details/7722667#commentBox

    大小端根据字节序分区分

     为什么有大小端之分???
     因为在计算机系统中,存储是以字节为单位的,每个地址单元都对应着一个字节,一个字节=8bit。在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器)。对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,如何安排多个字节的存储(字节序),这就有了大端存储模式和小端存储模式
    字节序:大于一个字节类型的数据在内存中的存放顺序,在跨平台以及网络程序中需要注意
    分类:
    a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。(低位数在低地址端
    b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。(低位数在高地址端,类似于字符串排序
    c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
    注意:通常我们说的主机序(Host Order)就是遵循Little-Endian规则。所以当两台主机之间要通过TCP/IP协议进行通信的时候就需要调用相应的函数进行主机序 (Little-Endian)和网络序(Big-Endian)的转换。

    例子:

    如果小端存放方式(假设从地址0x4000开始存放)为:
                                              内存地址     0x4000     0x4001     0x4002     0x4003
                                              存放内容     0x78        0x56        0x34         0x12
    而在Big- endian模式CPU内存中的存放方式则为:
                                              内存地址     0x4000     0x4001     0x4002     0x4003
                                              存放内容     0x12         0x34        0x56         0x78

    大小端优缺点

    Big-Endian优点:首先提取最高位字节(在低地址上),可以快速确定数的正负。即符号位的判定固定为第一个字节,容易判断正负。
    Little-Endian优点:提取一个,两个,四个或者更长字节数据的汇编指令以与其他所有格式相同的方式进行:首先在偏移地址为0的地方提取最低位的字节,因为地址偏移和字节数是一对一的关系,多重精度的数学函数就相对地容易写了。强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
    常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式.

    代码测试大小端

    首先了解c语言中的联合体或者共用体union:https://blog.csdn.net/huqinwei987/article/details/23597091
    union中的变量完全是共用一个内存首地址。
    剖析:由于联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用Little- endian还是Big-endian模式读写。
     

    #include <iostream>
    using namespace std;
    bool isBigEndian();
    bool isLittleEndian();
    int main()
    {
    	if (isBigEndian())
    		cout << "大端" << endl;
    	else
    		cout << "小端" << endl;
    	if (isLittleEndian())
    		cout << "小端" << endl;
    	else
    		cout << "大端" << endl;
    	system("pause");
    	return 0;
    }
    
    //方法1
    bool isBigEndian()
    {
    	short int a = 0x1122;//16进制,一个数值占4位;short in占2个字节,16位
        //8个字节对应16进制的两个数值,
        //通过将short(2字节)强制类型转换成char单字节,
        //b指向a的起始字节(低字节)
    	char b = *(char*)&a;
    	if (b == 0x11)//高位低址
    	{
    		return true;
    	}
    	else
    		return false;
    }
    //方法2:利用union,原理:联合体union的存放顺序是所有成员都从低地址开始存放,而且所有成员共享存储空间,更易理解
    bool isLittleEndian()
    {
    	union temp
    	{
    		short int a;
    		char b;
    	}temp;
    	temp.a = 0x1234;//2字节16位对应16进制的4个数值
    	if (temp.b == 0x12)//高位低址:大端
    	{
    		return false;
    	}
    	else
    		return true;
    }

     

    展开全文
  • C语言测试cpu大端小

    2021-03-22 22:47:01
    C语言测试CPU大端小端模式 -计算机组成原理基础学习(内存对齐) #include<iostream> #include<stdio.h> using namespace std; struct test1 { //cpu中内存对齐分配 char a;//4个字节 int b;//4个...

    C语言测试CPU大端小端模式
    -计算机组成原理基础学习(内存对齐)

    #include<iostream>
    #include<stdio.h>
    
    using namespace std;
    
    struct test1 {
    	//cpu中内存对齐分配
    	char a;//4个字节 
    	int b;//4个字节 
    	char c;//4个字节 
    };<!--more-->
    struct test2 {
    	//cpu中内存对齐分配 
    	char a;//2个字节 
    	char b;//2个字节 
    	int c;//4个字节 
    };
    union {
    	char a;
    	int b;
    } test3;
    int main(void) {
    	test1 a;
    	cout<<sizeof(a)<<endl;
    	test2 b;
    	cout<<sizeof(b)<<endl;
    	test3.b=1;
    	if(test3.a==1)
    		cout<<"小端模式"<<endl;
    	else
    		cout<<"大端模式"<<endl;
    	return 0;
    }
    
    展开全文
  • 如何判断CPU大端还是端模式

    千次阅读 2018-01-18 16:59:25
    在各种体系的计算机中通常采用的字节存储机制主要有两种: Big-Endian和Little-Endian,即大端模式和端模式。 Big-Endian和Little-Endian的定义如下: 1) Little-Endian:就是低位字节排放在内存的低地址端,...

    一、概念及详解

    在各种体系的计算机中通常采用的字节存储机制主要有两种: Big-EndianLittle-Endian,即大端模式和小端模式。

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

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

    举一个例子,比如16进制数字0x12345678在内存中的表示形式为:

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

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

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

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

    如何判断机器的字节序

    int i=1;   
    char *p=(char *)&i;   
    if(*p == 1)     
        printf("小端模式"); 
    else // (*p == 0)
        printf("大端模式");

    或者使用联合体union:

    //return 1 : little-endian
    //       0 : big-endian
    int checkCPUendian()
    {
        union {
            unsigned int a;
            unsigned char b; 
        } c;
    
        c.a = 1;
        return (c.b == 1); 
    }

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

    常见的字节序

    一般操作系统都是小端,而通讯协议是大端的。

    常见CPU的字节序

    大小端CPU
    Big EndianPowerPC、IBM、Sun
    Little Endianx86、DEC

    ARM既可以工作在大端模式,也可以工作在小端模式。

    常见文件的字节序

    文件格式大小端
    Adobe PSBig Endian
    BMPLittle Endian
    DXF(AutoCAD)Variable
    GIFLittle Endian
    JPEGBig Endian
    MacPaintBig Endian
    RTFLittle Endian

    另外,Java和所有的网络通讯协议都是使用Big-Endian的编码。

    大端小端的转换方法

    #define BigtoLittle16(A)                 ((((uint16)(A) & 0xff00) >> 8) | \
                                             (((uint16)(A) & 0x00ff) << 8))
    
    
    #define BigtoLittle32(A)                 ((((uint32)(A) & 0xff000000) >> 24) | \
                                             (((uint32)(A) & 0x00ff0000) >> 8) | \
                                             (((uint32)(A) & 0x0000ff00) << 8) | \
                                             (((uint32)(A) & 0x000000ff) << 24))

    参考资料

    展开全文
  • 大端端 在嵌入式开发中,大端(Big-endian)和端(Little-endian)是一个很重要的概念。 MSB与LSB 最高有效位(MSB)指二进制中最高值的比特。在16比特的数字音频中,其第1个比特便对16bit的字的数值有...

    大端与小端


    在嵌入式开发中,大端(Big-endian)和小端(Little-endian)是一个很重要的概念。

    MSB与LSB


    最高有效位(MSB)指二进制中最高值的比特。在16比特的数字音频中,其第1个比特便对16bit的字的数值有最大的影响。例如,在十进制的15,389这一数字中,相当于万数那1行(1)的数字便对数值的影响最大。比较与之相反的“最低有效位”(LSB)。

    LSB(Least Significant Bit),意为最低有效位;MSB(Most Significant Bit),意为最高有效位

    若MSB=1,则表示数据为负值,若MSB=0,则表示数据为正。
    MSB高位前导,LSB低位前导。

    谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?

    其实big endian是指低地址存放最高有效字节(MSB)
    而little endian则是低地址存放最低有效字节(LSB)。

    MSDN中关于LE和BE的解释

    Byte Ordering Byte ordering Meaning
    big-endian The most significant byte is on the left end of a word.
    little-endian The most significant byte is on the right end of a word.

    这里这个最重要的字节可以解释成值的最高位,如果换成是钱的话就是最值钱的那一位

    Big endian machine: It thinks the first byte it reads is the biggest.
    Little endian machine: It thinks the first byte it reads is the littlest.

    比如我有1234元人民币,最值钱的是1000元,最不值钱的是4元,那么这个1就是最重要的字节

    下面我们详细讲下大小端模式的问题

    端模式(Endian)


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

    大端


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

    这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这种存放方式符合人类的正常思维

    小端


    小端(Little-endian)模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中

    这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

    总结


    采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将高位存放在高地址。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。到目前为止,采用大端或者小端进行数据存放,其孰优孰劣也没有定论。

    有的处理器系统采用了小端方式进行数据存放,如intel芯片是小端(修改分区表时要注意)。

    有的处理器系统采用了大端方式进行数据存放,如IBM半导体和Freescale的PowerPC处理器以及一些常见的单片机芯片。不仅对于处理器,一些外设的设计中也存在着使用大端或者小端进行数据存放的选择。

    特别的intel x86的CPU使用的是LE(Windows中称为“主机字节序”),而SocksAddr中使用的则是BE(就是“网络字节序”),所以在使用网络编程时需要使用htns,htnl,nths,nthl来倒字节序。

    因此在一个处理器系统中,有可能存在大端和小端模式同时存在的现象。这一现象为系统的软硬件设计带来了不小的麻烦,这要求系统设计工程师,必须深入理解大端和小端模式的差别。大端与小端模式的差别体现在一个处理器的寄存器,指令集,系统总线等各个层次中。

    示例分析


    假如现有一32位int型数0x12345678
    那么

    其MSB(Most Significant Byte,最高有效字节)为0x12,
    其LSB (Least Significant Byte,最低有效字节)为0x78

    地址偏移大端模式小端模式
    0x0012(OP0)78(OP3)
    0x0134(OP1)56(OP2)
    0x0256(OP2)34(OP1)
    0x0378(OP3)12(OP0)

    也可以看下面这个图

    这里写图片描述

    我们可以看到看到

    • 大端(Big-endian)模式下数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,特别的MSB最高有效字节为0x12存放在低字节

    • 小端(Little-endian)模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,,特别的LSB最高有效字节为0x78存放在低字节

    填写数据时我们可以发现

    BE big-endian 大端模式
    最直观的字节序
    地址低位存储值的高位
    地址高位存储值的低位
    为什么说直观,不要考虑对应关系
    只需要把内存地址从左到右按照由低到高的顺序写出
    把值按照通常的高位到低位的顺序写出
    两者对照,一个字节一个字节的填充进去

    LE little-endian 小端模式
    最符合人的思维的字节序
    地址低位存储值的低位
    地址高位存储值的高位
    怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说
    低位值小,就应该放在内存地址小的地方,也即内存地址低位
    反之,高位值就应该放在内存地址大的地方,也即内存地址高位

    程序分析


    这里写图片描述

    如何编写程序测试看CPU使用的是大端模式还是小端模式
    下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:

    <code class="hljs cpp has-numbering"><span class="hljs-preprocessor">#include<stdio.h></span>
    
    
    
    <span class="hljs-keyword">int</span> main()
    
    {
    
        <span class="hljs-keyword">short</span> <span class="hljs-keyword">int</span> x;
    
        <span class="hljs-keyword">char</span> x0,x1;
    
        x=<span class="hljs-number">0x1122</span>;
    
        x0=((<span class="hljs-keyword">char</span> *)&x)[<span class="hljs-number">0</span>];  <span class="hljs-comment">//低地址单元</span>
    
        x1=((<span class="hljs-keyword">char</span> *)&x)[<span class="hljs-number">1</span>];  <span class="hljs-comment">//高地址单元</span>
    
        <span class="hljs-built_in">printf</span>(<span class="hljs-string">"x0=0x%x,x1=0x%x"</span>,x0,x1);<span class="hljs-comment">// 若x0=0x11,则是大端; 若x0=0x22,则是小端......</span>
    
        <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
    
    }</code>

    我们把他封装成函数的形式

    <code class="hljs cs has-numbering"><span class="hljs-comment">//返回值:大端返回1,小段返回0</span>
    
    
    <span class="hljs-keyword">int</span> check_end()
    {
        <span class="hljs-keyword">int</span>   i = <span class="hljs-number">0x12345678</span>;
        <span class="hljs-keyword">char</span> *c = (<span class="hljs-keyword">char</span> *)&i; 
    
        <span class="hljs-keyword">return</span> (*c == <span class="hljs-number">0x12</span>);
    }</code>

    也可以

    <code class="hljs d has-numbering"><span class="hljs-comment">//返回值:大端返回1,小段返回0</span>
    
    
    <span class="hljs-keyword">int</span> CheckEnd()
    {
        <span class="hljs-keyword">union</span>
        {
            <span class="hljs-keyword">int</span> a;
            <span class="hljs-built_in">char</span> b;
        }u;
    
        u.a = <span class="hljs-number">1</span>;
        <span class="hljs-keyword">if</span> (u.b == <span class="hljs-number">1</span>)
            <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
        <span class="hljs-keyword">else</span> 
            <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;
    }</code>

    参考
    深入浅出大端和小端

    展开全文
  •  关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大...
  • 关于大端模式和端模式的概念及判断方式(内含代码实例)
  • 大端小端模式

    2014-03-04 17:57:35
    描述大端端模式,给出了如何判断CPU是哪种模式的代码!
  • #include <...int checkCPU() { union w { int a; char b; } c; c.a = 1; return c.b == 1;//如果低地址还是1说明低地址存放低字节,端 }//如果低地址不是1,则高地址是1,说明低地址...
  • 关注、星标公众号,不错过精彩内容素材来源:网络编辑整理:strongerHuang之前给大家分享过大小端的一些内容,阅读本文之前可以再次回顾一下:你真的懂CPU大小端模式吗?大小端格式由...
  • CPU中的大端

    千次阅读 2014-09-12 11:12:17
     一、如何判断CPU大端还是端? 明白大端端的区别,实现起来就非常简单:
  • 大端端在嵌入式开发中,大端(Big-endian)和端(Little-endian)是一个很重要的概念。MSB与LSB最高有效位(MSB)指二进制中最高值的比特。在16比特的数字音频中,其第1个比特便对16bit的字的数值有最大的影响...
  • 如何确认系统是采用大端还是端**1、大小端**大端(存储)模式:**是指一个数据的低位字节序的内容放在高地址处,高位字节序存的内容放在低地址处。如:一个数0x12345678存放在一个4字节空间里**端(存储)模式:**是...
  • 物联网 硬件工程师 新能源汽车 相关文档
  • 大端

    千次阅读 2021-03-10 11:00:05
    一、什么是大端大端模式,就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 端模式,就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 举个例子,比如数字 0x12 34 56...
  • C++大端小段的判断和转换

    千次阅读 2013-12-09 09:52:25
    当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-endian)和端(little- ...
  • 大端字节序:高字节存放在...大小端字节顺序它是CPU的属性,所哟不同的CPU的大小端字节顺序也不同,移植的时候需要先判断当前的CPU大端还是端字节序,如果不同则移植需要转移字节序int num = 0x12345678 大端
  • cpu大小端详解

    2021-02-09 18:51:47
    cpu大小端详解大小端大端(Big-Endian)释义端(Little-Endian)释义举例大端(Big-Endian)端(Little-Endian)大小端应用情况Intel的80x86系列芯片ARM芯片MIPS芯片C语言java语言网络传输数据 大小端 大端(Big...
  • 大端存储 小段存储 网络字节顺序

    千次阅读 2016-11-04 14:16:46
    关于字节序(大端法、端法)的定义 《UNXI网络编程》定义:术语“端”和“大端”表示多字节值的哪一端(端或大端)存储在该值的起始地址。端存在起始地址,即是端字节序;大端存在起始地址,即是大端字节序。...
  • 电脑的cpu有两种,大端cpu大端cpu: 所谓的大端,是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由向大...
  • 大端端指对操作数的存放,大端从高到低放,端从低到高放。X86的intel平台为端,单片机一般为大端。 举个例子: 操作数0x12345678在内存中的存放,假设从地址0x4000开始放。 大端: 内存地址
  • 下面这代码利用联合体的第一个特性来判断CPU的大小端模式:输出的如果是true,则为端模式,否则是大端模式; #include<stdio.h> #include<stdlib.h> int checkcpu(void){ union w..
  • MSB:Most Significant Bit ------- 最高有效位 LSB:Least Significant Bit ------- 最低有效位 ... 大端模式(big-edian)  big-endian:MSB存放在最低端的地址上。 举例,双字节
  • PLC中的大端小

    千次阅读 2019-11-20 08:37:10
    相信大家在阅读有关通讯数据传输、PLC数据存储等技术文档时,经常会碰到“Big-Endian”(大端对齐)与Little-Endian(端对齐)术语。很多朋友不理解大端端模式,本文给大家写一下此知识点。 为什么有大端...
  • 操作系统之大端小

    千次阅读 2020-08-03 18:30:57
    1. 什么是大端,什么是端: 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中; 所谓的端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址...
  • 1 、写一个函数用来判断机器是大端存储吗? int is_big_endian(void) { union { uint32_t i; char c[4];...2、如果是端存储,写一个函数将数据转换成大端存储。 unsigned int l2b(unsign...
  •  //cpu数据存储形式:有大端模式和小段模式  //大端模式:高地址存储数据的低位,低地址存储数据的高位;  //小端模式:高地址存储数据的高位,低地址存储数据的低位;  //判断方式:  //定义一个int型...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,069
精华内容 5,627
关键字:

cpu大端小段