文档章节

CPU的大小端模式

小汉憨憨
 小汉憨憨
发布于 2012/06/04 00:00
字数 835
阅读 351
收藏 12

不同体系结构的CPU,数据在内存中存放的排列顺序是不一样的。

存储器中对数据的存储是以字节(Byte)为基本单位的,因此,字(Word)和半字(Half-Word)在存储器中就有两种次序,分别称为:大端模式(Big Endian)小端模式(Little Endian)

大端存储模式是指字或半字的最高字节(MSB)存放在内存的最低位字节地址上,而字数据的低字节(LSB)则存放在高地址中。打个比方,有一个字为0x12345678,这个字由4个字节组成, 从高位到低位的次序为:0x12,0x34,0x56,0x78。如果把这个字存放在以0x00000000起始的内存中,这个字在内存中的实际存放情况 如下表:

内存地址

存储的数据(Byte)

0x00000000

0x12

0x00000001

0x34

0x00000002

0x56

0x00000003

0x78

0x00000004

……


大端模式的次序就像是我们平时书写的次序,先写大数,后写小数。另外,大端存储次序还广泛运用在TCP/IP协议上,因此又称为网络字节次序

小端存储模式是指字或半字的最低位字节(LSB存放在内存的最低位字节地址上,而字数据的高字节(MSB则存放在高地址中。还以0x12345678为例,在小端模式下存储如下表所示:

内存地址

存储的数据(Byte)

0x00000000

0x78

0x00000001

0x56

0x00000002

0x34

0x00000003

0x12

0x00000004

……


说明:其中一个数据的最重要的位为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 = 0x12345678;
    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; 
    }  
         
}



© 著作权归作者所有

小汉憨憨
粉丝 4
博文 12
码字总数 14052
作品 0
武汉
程序员
私信 提问
详解大端模式和小端模式

详解大端模式和小端模式 一、大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一...

长平狐
2013/06/03
193
0
小议大小端模式对C语言的共用体结构的影响

小议大小端模式对C语言的共用体结构的影响 1、一些问题 问题1 答案是B A;为什么不是A B呢? 在前面的文章中我们已经测试过,X86体系结构的CPU是小端模式的。比如一个数0x1234,放在内存里按照...

长平狐
2013/06/03
61
0
大端模式&小端模式、主机序&网络序、入栈地址高低问题

一、大端模式&小端模式 所谓的“大端模式”,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作...

AlphaJay
2010/06/13
1K
0
CUDA并行计算框架(一)概念相关、内容比较抽象。

一. 概念。 1. 相关关键字。 CUDA(Compute Unified Device Architecture)。 GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”。 2. CUDA是一种由NVIDIA推出的通用并行计算架构...

wbf961127
2017/11/12
0
0
深入分析S3C2440启动代码中大小端问题

深入分析S3C2440启动代码中大小端问题 一、ADS1.2中关于大小端的设置以及对编译后的代码的影响 下面是一段代码在线段模式下编译,生成的二进制文件的内容 大端模式下编译,生成二进制文件的内...

长平狐
2013/06/03
119
0

没有更多内容

加载失败,请刷新页面

加载更多

使用TensorFlow的AI程序运行报错AttributeError: module 'tensorflow' has no attribute 'xxx'

使用TensorFlow的AI程序,在运行时报错AttributeError: module 'tensorflow' has no attribute 'xxx',首先检查是否是包路径不对,一般是版本变化所致。...

织梦之魂
35分钟前
2
0
提示浏览器版本低

本文转载于:专业的前端网站➭提示浏览器版本低 网站网页在遇到浏览器低版本(尤其是IE浏览器)时,提示浏览器版本低(如IE8以及以下),建议用户升级浏览器以获得最好体验。以下是代码: 1...

前端老手
36分钟前
5
0
CentOS 7系统增加swap

转载请注明文章出处:CentOS 7系统增加swap swap是位于磁盘上的特殊文件(或分区),属于“虚拟内存”的一部分。通俗点就是内存的备胎,内存充足的情况下,基本上没swap什么事(和设置有关)...

tlanyan
59分钟前
6
0
基于Prometheus和Grafana的监控平台 - 环境搭建

相关概念 微服务中的监控分根据作用领域分为三大类,Logging,Tracing,Metrics。 Logging - 用于记录离散的事件。例如,应用程序的调试信息或错误信息。它是我们诊断问题的依据。比如我们说...

JAVA日知录
今天
6
0
PHP运行时全局构造体

struct _php_core_globals { zend_bool magic_quotes_gpc; // 是否对输入的GET/POST/Cookie数据使用自动字符串转义。 zend_bool magic_quotes_runtime; //是否对运行时从外部资源产生的数据使...

冻结not
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部