大端存储和小端存储【转】

一、什么是字节序
字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。其实大部分人在实际的开 发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。

在所有的介绍字节序的文章中都会提到字 节序分为两类:Big-Endian和Little-Endian,引用标准的Big-Endian和Little-Endian的定义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。

1.1 什么是高/低地址端
首先我们要知道C程序映像中内存的空间布局情况:在《C专 家编程》中或者《Unix环境高级编程》中有关于内存空间布局情况的说明,大致如下图:
----------------------- 最高内存地址 0xffffffff
栈底

栈顶
-----------------------

NULL (空洞)
-----------------------

-----------------------
未初始 化的数据
----------------------- 统称数据段
初始化的数据
-----------------------
正 文段(代码段)
----------------------- 最低内存地址 0x00000000
由图可以看出,再内存分布中,栈是向下增长的,而堆是向上增长的。
以上图为例如果我们在栈 上分配一个unsigned char buf[4],那么这个数组变量在栈上是如何布局的呢?看下图:
栈底 (高地址)
----------
buf[3]
buf[2]
buf[1]
buf[0]

----------
栈顶 (低地址)
其实,我们可以自己在编译器里面创建一个数组,然后分别输出数组种每个元素的地址,来验证一下。
1.2 什么是高/低字节
现在我们弄清了高/低地址,接着考虑高/低字节。有些文章中称低位字节为最低有效位,高位字节为最高有效位。如果我们有一个32位无符号整型0x12345678,那么高位是什么,低位又是什么呢? 其实很简单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。
高/低地址端和高/低字节都弄清了。我们再来回顾 一下Big-Endian和Little-Endian的定义,并用图示说明两种字节序:
以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) -- 低位
--------------
栈 顶 (低地址)

时间: 2025-01-09 03:02:12

大端存储和小端存储【转】的相关文章

【c语言】验证计算机是大端存储还是小端存储

// 验证计算机是大端存储还是小端存储 #include <stdio.h> int main() { int a = 1; char *p; p = (char *)(&a); if(*p == 0 ) printf("当前计算机是大端存储\n"); else printf("当前计算机是小端存储\n"); return 0; } //也可以用联合实现 #include <stdio.h> union UN { int a; cha

20160403_联合体的本质和使用 &amp; 与struct的不同 &amp; 大端存储和小端存储

/************* 联合体的本质和使用 及 与struct的不同 及 大端存储和小端存储 ************ “联合体”(union)与“结构体”(struct)有一些相似之处.但两者有本质上的不同. [相似] union,中文名“联合体.共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量. [不同] 在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和.而在“联合”中,各

判断大端存储与小端存储

#include <stdio.h> int main() {  int a=0x11223344;  char *p = (char *)&a;  if  (*p==0x11)  {   printf("big\n");  }  else  {   printf("little\n");  }  return 0; }

测试计算机是小端存储还是大端存储

    一.理解大端存储和小端存储的概念     1).大端存储:大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放.                 2).小端存储:小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致.        

【总结】大端、小端存储模式的那点事

----------------------------------------------------------------------------------------------------- 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放: 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权

判断CPU 是小端存储(Little endian)还是大端存储(Big endian)模式

第一个版本: //return true in big-endian machines bool check_big_endian1() { int a = 0; int *p = &a; *(char *)p = 1; return a != 1; } 采用union的第二个版本: //return true in big-endian machines bool check_big_endian2() { union{ int a; char b; }var;//sizeof(var)=4

小端存储(little Endian)大端存储(big Endian)

小端存储--低内存低字节 87654321 字节或半字节的最低位字节(Lowest Significant Bit,LSB)存放于内存最低位字节地址上.即最低地址存放的最低字节,为Power PC,Intel x86 系列等采用. int a=0x12345678; 78为低字节 12为高字节 void fFun() { int a=0x12345678; char *p=(char *)&a; printf("0x%02X\n",*(++p)); } 0x56 大端存储(bi

大端和小端存储

小端存储法——高地址存高字节,低地址存低字节(高存高,低存低)(intel/ARM) 0x表示十六进制 数值:0x12 34 56 78在小端存储器里如何存储 0x8003 0x12 0x8002 0x34 0x8001 0x56 0x8000  0x78 1 BYTE = 8bit 大端存储法——高地址存低字节,低地址存高字节(高存低,低存高)(IBM大型机/网络字节序) 数值:0x12 34 56 78在小端存储器里如何存储 0x8003 0x78 0x8002 0x56 0x8001 0x

数据在内存中存储的方式:大端模式与小端模式

什么是大端模式,什么是小端模式? 所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放: 所谓小端模式(Little-endian), 是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内在的低地址中,这种存储模式将地址的高低和数据位 权有效结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致; 为什么有大小端之分: 因