利用联合体判断CPU是大端模式还是小端模式和大端模式

查看: 11284|回复: 17
51是小端模式,还是大端模式呢?
51是小端模式,还是大端模式呢?
还是51本身没有大小端之分,只是编译器采用大端或者小端。
是编绎器的关系。。
应该是和芯片有关的吧
51是大端模式
很久没有用51了。
标准52的指令集和寄存器,基本上都是8位的,因此不分大小端。
涉及大于8Bit操作应该是只有MOV DPTR, #imm一个指令,这个指令的编码印象中是大端的。就是OPCode, Hi 8Bit, Lo 8Bit,共3字节。
其它的数据类型,在C是编译器实现的,Keil用的是大端。用别的编译器可能会有变化。
【2楼】 billowtust 回答的很正确。是和芯片有关,51是大端模式 !!!!!!!!!!!!!
KEIL C51 是大端模式 SDCC是小端模式
其它的MCU的其它编译器我都见过的是小端模式
从个人主观上讲我喜欢小端模式.
iar8051也是小端模式。
51大端,AVR、微机小端。
小端就是“高高低低”(16位数的高8位放高地址),大端则刚好相反
【2楼】 billowtust 回答的很正确。是和芯片有关,51是大端模式 !!!!!!!!!!!!!
& &&&本人无聊再重复一边。看来大家的51单片机,,,呵呵。。。
& & 建议大家好好的找本单片机的书好好的看看。
看一个CPU是大端模式,还是小端模式,主要看该CPU的WORD的存放方式。例如ARM,既可以是大端模式,也可以是小端模式;80X86是小端模式。
我只有在用联合体的时候才会去编译器里看下是什么模式,一般使用不用操心,
模式在8位机里面是看编译器的吧。
4楼正解,大小端只与编译器有关,跟芯片没关系
大端.高字节在前.
unsigned long *x = 0x1000;
0x1000: 12
0x1001: 34
0x1002: 56
0x1003: 78
大端小端并不是编译器说了算,是CPU架构说了算.8位机一样有16位操作数,你看16位操作数是大端还是小端.比如
ljmp 0x1234
看它的机器码是怎么写的,就清楚了:
自己试试就知道了!!
keil是低地址存高字节!
关于大小端的问题,我同意4楼的意见。就CPU指令来讲肯定是分大小端的,除非全部指令都是8位的。对于8位机来说,多字节的数据类型是由编译器来处理的,所以编译器就存在了大小端的问题。
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
& && && && &大端& && &&&小端
0x0000& && &0x12& && &&&0xcd
0x0001& && &0x34& && &&&0xab
0x0002& && &0xab& && &&&0x34
0x0003& && &0xcd& && &&&0x12
下面Keil C51编译出的代码来看,Keil 是大端的
& & 68: a.w = 0x1234;
C:0x15AC& & 752812& &MOV& && &0x28,#0x12
C:0x15AF& & 752934& &MOV& && &0x29,#0x34
从C51定时器的寄存器地址来看,我认为C51 CPU本身应该是小端的,以下摘自Keil 的帮助文档:
the 8052 uses addresses 0xCC and 0xCD for the low and high bytes of timer/counter 2 respectively.
Access to 16-bit SFRs using sfr16 is possible only when the low byte immediately precedes the high byte (little endian) and when the low byte is written last. The low byte is used as the address in the sfr16 declaration. For example:
sfr16 T2 = 0xCC;& &&&/* Timer 2: T2L 0CCh, T2H 0CDh */
sfr16 RCAP2 = 0xCA;&&/* RCAP2L 0CAh, RCAP2H 0CBh */
和CPU的指令有关系,51芯片本身是大端模式
阿莫电子论坛, 原"中国电子开发网"
, 原www.ourdev.cn, 原www.ouravr.com[转载]联合体的初始化,判断大端模式和小端模式
联合变量可以被初始化,但这个初始值必须是联合体第一个成员的类型,而且他必须位于一对花括号里面。例如:
&char &c[4];
&}x = { 5 };
把x.a初始化为5。
我们不能把这个类量初始化为一个浮点值或字符值。如果给出的初始值是任何其他类型,他就会转换(如果可能的话)为一个整数并赋值给x.a。
&m.f=3.14159;
&printf("%dn",m.i);
首先把π的浮点表示形式存储与f,然后把这些相同的位当作一个整型值打印输出。注意这两个成员所引用的位相同,仅有的区别在于每个成员的类型决定了这些位被如何解释。
什么是大端和小端?Big-Endian和Little-Endian的定义如下:
Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
判断大端模式和小端模式:
#include &stdio.h&
int main()
& & union check
& & { &int
& & m.i=1;
& & if(m.ch==0x00) printf("System
is Big-Endian!n");
& & if(m.ch==0x01) printf("System
is Little-Endian!n");
& & return 0;
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。数值存储:CPU大端和小端模式详解
深入理解计算机-之-数值存储
在嵌入式开发中,大端(Big-endian)和小端(Little-endian)是一个很重要的概念。
最高有效位(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型数0x,
其MSB(Most Significant Byte,最高有效字节)为0x12,
其LSB (Least Significant Byte,最低有效字节)为0x78
也可以看下面这个图
vc/Cyv2+3bXEuN/X1r3asaO05tTaxNq05rXEtc212Na31tCjrLb4yv2+3bXEtc3X1r3asaO05tTaxNq05rXEuN+12Na31tAszNix8LXETVNC1+6439PQ0KfX1r3azqoweDEytOa3xdTatc3X1r3aPC9wPg0KPC9saT4NCjxsaT4NCjxwPtChtsujqExpdHRsZS1lbmRpYW6jqcSjyr2jrMrH1rjK/b7dtcS439fWvdqxo7Tm1NrE2rTmtcS437XY1rfW0KOstvjK/b7dtcS1zdfWvdqxo7Tm1NrE2rTmtcS1zbXY1rfW0KOsLMzYsfC1xExTQtfuuN/T0NCn19a92s6qMHg3OLTmt8XU2rXN19a92jwvcD4NCjwvbGk+DQo8L3VsPg0KPHA+zO7QtMr9vt3Ksc7Sw8e/ydLUt6LP1jwvcD4NCjxwPkJFIGJpZy1lbmRpYW4gtPO2y8Sjyr08YnIgLz4NCtfu1rG527XE19a92tDyPGJyIC8+DQq12Na3tc3Ou7TmtKLWtbXEuN/OuzxiciAvPg0KtdjWt7jfzru05rSi1rW1xLXNzrs8YnIgLz4NCs6qyrLDtMu11rG526OssrvSqr+8wse21NOmudjPtTxiciAvPg0K1rvQ6NKqsNHE2rTmtdjWt7TT1/O1vdPSsLTV1dPJtc21vbjftcTLs9Dy0LSz9jxiciAvPg0KsNHWtbC01dXNqLOjtcS4tcTLs9Dy0LSz9jxiciAvPg0Kwb3V37bU1dWjrNK7uPbX1r3a0ru49tfWvdq1xMzus+S9+MilPC9wPg0KPHA+TEUgbGl0dGxlLWVuZGlhbiDQobbLxKPKvTxiciAvPg0K1+63+7rPyMu1xMu8zqy1xNfWvdrQ8jxiciAvPg0KtdjWt7XNzru05rSi1rW1xLXNzrs8YnIgLz4NCrXY1re43867tOa0ota1tcS43867PGJyIC8+DQrU9cO0vbLKx9fut/u6z8jLtcTLvM6stcTX1r3a0PKjrMrH0vLOqrTTyMu1xLXa0ru527jQwLTLtTxiciAvPg0Ktc3Ou9a10KGjrL7N06a4w7fF1NrE2rTmtdjWt9ChtcS12Le9o6zSsry0xNq05rXY1re1zc67PGJyIC8+DQq3tNauo6y438671rW+zdOmuMO3xdTaxNq05rXY1re087XEtdi3vaOs0rK8tMTatOa12Na3uN/OuzwvcD4NCjxoMSBpZD0="程序分析">程序分析
如何编写程序测试看CPU使用的是大端模式还是小端模式
下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:
int main()
char x0,x1;
x0=((char *)&x)[0];
//低地址单元
x1=((char *)&x)[1];
//高地址单元
printf(&x0=0x%x,x1=0x%x&,x0,x1);// 若x0=0x11,则是大端; 若x0=0x22,则是小端......
我们把他封装成函数的形式
//返回值:大端返回1,小段返回0
int check_end()
char *c = (char *)&i;
return (*c == 0x12);
//返回值:大端返回1,小段返回0
int CheckEnd()
if (u.b == 1)博客访问: 34152
博文数量: 4
博客积分: 0
博客等级: 民兵
技术积分: 261
注册时间:
认证徽章:
专注于嵌入式系统软件及驱动开发。
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
不同体系结构的CPU,数据在内存中存放的排列顺序是不一样的。
存储器中对数据的存储是以字节(Byte)为基本单位的,因此,字(Word)和半字(Half-Word)在存储器中就有两种次序,分别称为:大端模式(Big Endian)和小端模式(Little Endian)。
大端存储模式是指字或半字的最高字节(MSB)存放在内存的最低位字节地址上,而字数据的低字节(LSB)则存放在高地址中。打个比方,有一个字为0x,这个字由4个字节组成, 从高位到低位的次序为:0x12,0x34,0x56,0x78。如果把这个字存放在以0x起始的内存中,这个字在内存中的实际存放情况 如下表:
存储的数据(Byte)
大端模式的次序就像是我们平时书写的次序,先写大数,后写小数。另外,大端存储次序还广泛运用在TCP/IP协议上,因此又称为网络字节次序。
小端存储模式是指字或半字的最低位字节(LSB)存放在内存的最低位字节地址上,而字数据的高字节(MSB)则存放在高地址中。还以0x为例,在小端模式下存储如下表所示:
存储的数据(Byte)
说明:其中一个数据的最重要的位为MSB(Most Significant Byte/Bit),最不重要的位叫做LSB(Least Significant
Byte/Bit),重不重要是看它在整个数据中所占的权重相关的,如0x1234568的MSB即为0x12(占大头,如果0x12没有了,那么整
个数的值就下降了太多),LSB为0x78(最后两位,如果0x78没有了,对整个数的影响较小)。Big Endian和Little
Endian的区别就是Big Endian规定MSB在存储时放在低地址,在传输时MSB放在流的开始,LSB存储时放在高地址,在传输时放在流的末尾,即高位优先;Little Endian则相反。
并且还需要注意的几点是:
(1)&&&数据在寄存器中都是以大端模式次序存放的。
(2)&&&对于内存中以小端模式存放的数据。CPU存取数成时,小端和大端之间的转换是通过硬件实现的,没有数据加载/存储的开销。
知道了大小端模式的概念,但如果让我们用C语言写段代码判断一个CPU是大端模式还是小端模式应当如何做呢 ?
一种比较第简单的方法如:
int CheckEndian(void)
&&&&int a = 0x;
&&&&char *p = (char*)(&a);
&&&&if(0x78 == *p){
&&&&&&&&return Little_Endian;
&&&&}else{
&&&&&&&&return Big_Endian;
另外还可以用到联合体(union)来实现,简单的说union就是一种结构,在union中所有的数据成员共用一个存储空间,在同一时间只能存储其中的一个数据成员,所有的数据成员具相同的起始地址,相对于基地址的偏移量都为0;
采用union来判断,具体代码如下:
int CheckEndian(void)
&&&&union check
&&&&&&&&int Word;
&&&&&&&&char Byte;&
&&&&} Endian;
&&&&Endian.Word=1;
&&&&if(1 == Endian.Byte) {
&&&&&&&&return Little_Endian;
&&&&}else{
&&&&&&&&return Big_Endian;
阅读(3307) | 评论(0) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。电脑的cpu有两种,大端和小端cpu。
所谓的大端,是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:...
字节序不是由操作系统决定的,而是由cpu架构决定的。
CPU架构是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分不同类型CPU的重要标示。目前市面上的CPU指令集分类主要分有两...
电脑的cpu有两种,大端和小端cpu。
所谓的大端,是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺...
如何判断CPU是大端还是小端模式
http://blog.sina.com.cn/s/blog_66a61fm0.html
MSB:Most Significant Bit...
一、大端模式和小端模式的起源
关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去...
这里转载一片文章,通过这篇文章我了解了转换成网络字节顺序的意义,以前在作TCP/IP通信的时候对于htonl()函数不是很理解,现在知道了,原来我们普通的x86体系结构都是小端模式,而网络传输要求的是...
大端模式与小端模式
  一、概念及详解
  在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。
  先回顾两...
大端模式与小端模式
一、概念及详解
  在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。
  先回顾...
http://wxxweb.blog.163.com/blog/static//
大端模式与小端模式
一、概念及详解
  在各种体系的计算机中...
大端模式与小端模式
一、概念及详解
  在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 大端存储和小端存储 的文章

 

随机推荐