`
gaojingsong
  • 浏览: 1182967 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

计算机中的Big & Little Endian

 
阅读更多

“大端”和“小端”可以追溯到1726年的Jonathan Swift的《格列佛游记》,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端还是先打破较小的一端而争执不休,甚至爆发了战争。1981年10月,Danny Cohen的文章《论圣战以及对和平的祈祷》(On holy wars and a plea for peace)将这一对词语引入了计算机界。这么看来,所谓大端和小端,也就是big-endian和little-endian,其实是从描述鸡蛋的部位而引申到计算机地址的描述,也可以说,是从一个俚语衍化来的计算机术语。稍有些英语常识的人都会知道,如果单靠字面意思来理解俚语,那是很难猜到它的正确含义的。在计算机里,对于地址的描述,很少用“大”和“小”来形容;对应地,用的更多的是“高”和“低”;很不幸地,这对术语直接按字面翻译过来就成了“大端”和“小端”,让人产生迷惑也不是很奇怪的事了。

 

"大端"和"小端"表示多字节值的哪一端存储在该值的起始地址处;小端存储在起始地址处,即是小端字节序;大端存储在起始地址处,即是大端字节序;

或者说:

1.小端法(Little-Endian)就是低位字节排放在内存的低地址端(即该值的起始地址),高位字节排放在内存的高地址端;

2.大端法(Big-Endian)就是高位字节排放在内存的低地址端(即该值的起始地址),低位字节排放在内存的高地址端;

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

1)大端模式:

低地址 -----------------> 高地址

0x12  |  0x34  |  0x56  |  0x78

2)小端模式:

低地址 ------------------> 高地址

0x78  |  0x56  |  0x34  |  0x12

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

 

 

 

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

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

 

 

网络字节序

网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题;

UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的;

所以说,网络字节序是大端字节序;

 

 

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

#include<stdio.h>

int main(){

    short int x;

    char x0,x1;

    x=0x1122;

    x0=((char *)&x)[0];  //低地址单元

    x1=((char *)&x)[1];  //高地址单元

    printf("x0=0x%x,x1=0x%x",x0,x1);// 若x0=0x11,则是大端; 若x0=0x22,则是小端......

    return 0;

}

 

大小端现阶段状况

目前Intel的80x86系列芯片是唯一还在坚持使用小端的芯片,ARM芯片默认采用小端,但可以切换为大端;而MIPS等芯片要么采用全部大端的方式储存,要么提供选项支持大端——可以在大小端之间切换。另外,对于大小端的处理也和编译器的实现有关,在C语言中,默认是小端(但在一些对于单片机的实现中却是基于大端,比如Keil 51C),Java是平台无关的,默认是大端。在网络上传输数据普遍采用的都是大端。

0
0
分享到:
评论

相关推荐

    Big Endian & Little Endian.pdf

    综上所述,Big Endian与Little Endian是计算机科学中两种重要的数据存储方式。了解它们的区别及其应用场景对于确保跨平台数据交换的正确性至关重要。无论是软件开发还是网络通信,掌握字节序的基本概念都是非常必要...

    nohead big endian to little endian

    nohead data big endian to little endian

    大端(Big Endian)与小端(Little Endian)简介

    这些字节如何在内存中排列,涉及到两种主要的存储方式——大端(Big Endian)与小端(Little Endian)。本文将深入探讨这两种存储方式的概念、原理及其应用场景。 #### 二、大端与小端的定义 1. **大端表示法(Big...

    little endian和big endian的概念解释

    其中,Little Endian 和 Big Endian 是两种常见的字节顺序(Byte Order)格式,它们主要用来描述多字节数据在内存中的存储方式。 - **Little Endian**:在这种格式下,较低有效字节(Lower Byte)被存储在较低的...

    Little_Big_endian.rar_big endian_little

    这里我们主要讨论两种字节顺序:大端字节序(Big-endian)和小端字节序(Little-endian)。这两个术语源自Gulliver's Travels中的两个部落名称,用来形象地描述数据在内存中的排列方式。 标题“Little_Big_endian....

    Big-and-Little-Endian.rar_LIt_endian_little

    在计算机科学中,大端字节序(Big-Endian)和小端字节序(Little-Endian)是两种主要的数据存储方式,对于理解和编写跨平台应用程序的开发者来说至关重要。这两种字节序涉及到如何在内存中存储多字节数据类型,如...

    little endian,big endian 小端存储、大端存储.zip

    little endian,big endian 小端存储、大端存储.zip

    STM32F103CB_Big_Little_Endian_Demo.zip

    基于STM32HAL库,USART-调试串口(大小端测试),对应文章:https://blog.csdn.net/qq_36075612/article/details/115935138?spm=1001.2014.3001.5501

    大端(Big_Endian)与小端(Little_Endian)简介

    在计算机科学领域,大端(Big Endian)与小端(Little Endian)指的是数据(特别是多字节整数)在内存中存储时的字节顺序。这两种表示方法主要应用于不同类型的计算机体系结构中,对软件开发尤其是跨平台编程具有...

    Macro-test-mode-test-system.zip_endian_little endian

    在计算机科学中,"Endian" 是一个术语,用于描述多字节数据类型(如整数或浮点数)在内存中的存储方式。Endianness 主要分为两种:大端法(Big Endian)和小端法(Little Endian)。这个名为 "Macro-test-mode-test-...

    字节存储顺序: little-endian小端,big-endian大端 教程

    你是否遇到过,内存中的数据顺序颠倒 你存入1234,实际存储的是3412. 字节存储顺序: little-endian小端,big-endian大端 教程 主机序,网络序 hton,ntoh

    大端(Big Endian)与小端(Little Endian)简介.doc

    大端(Big Endian)与小端(Little Endian)是指计算机系统中多字节数据在内存中的存储方式。这个概念主要涉及到处理器架构和数据表示,对于跨平台编程和网络通信尤其重要。Endianness的问题源于不同的计算机系统...

    字符编码转换类,支持 ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom互相转换

    本文将深入探讨PHP中的字符编码转换,特别是针对ANSI、Unicode(包括Little Endian和Big Endian)、UTF-8以及UTF-8+BOM的转换。 首先,让我们了解这些编码格式的含义: 1. ANSI编码:通常指的是Windows系统的默认...

    uclibc源代码

    uClibc运行于标准的以及无MMU的Linux系统上,支持i386,x86 64,ARM (big/little endian), AVR32,Blackfin,h8300,m68k,MIPS (big/little endian), PowerPC,SuperH (big/little endian), SPARC,和v850等处理器...

    解析大端模式和小端模式

    目前主要存在两种字节序类型:大端模式(Big Endian)与小端模式(Little Endian)。这两种模式直接影响着程序在不同系统之间的兼容性以及网络通信中数据包的解码。 #### 大端模式(Big Endian) 大端模式是指在多...

    is-little-endian:检查您的系统是否为小端

    buffer ) ) [ 0 ] === 0x04030201 )用法使用 npm 安装: npm install is-little-endian然后像这样使用它: if ( require ( "is-little-endian" ) ) { // Use little endian buffer} else { // Use big endian ...

    字符编码转换 Text、ANSI、Unicode、Unicode Big Endian、UTF-8、UTF-7

    本篇文章将深入探讨标题中提及的几种字符编码:Text、ANSI、Unicode(包括Little Endian和Big Endian)、UTF-8以及UTF-7,并介绍它们之间的转换。 1. **Text编码**: 在Windows系统中,通常所说的"Text"编码是指...

    西门子PLC接口,大端和小-Endian的存储格式.pdf

    西门子PLC接口,大端和小-Endian的存储格式pdf,西门子PLC接口,大端和小-Endian的存储格式:本文介绍了SINUMERIK:PLC接口,和Little-Endian的Big-Endian的存储格式

    判断CPU大小端模式

    请写一个C函数,若处理器是Big_endian的,则返回 0;若是Little_endian的,则返回1。 • 函数原型:int checkCPU( );

    网络字节序和主机字节序

    例如,在 TCP/IP 协议中,网络字节顺序采用 Big Endian 排序方式,而在某些嵌入式系统中,可能使用 Little Endian 或 Big Endian。 字节序是计算机科学中一个重要的概念,它对计算机程序的正确执行和数据传输的正确...

Global site tag (gtag.js) - Google Analytics