`
jiq408694711
  • 浏览: 36563 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

CPU端序(字节序)

 
阅读更多

小端: 低地址存放低位字节。(x86是小端模式

大端: 低地址存放高位字节。(非x86是大端模式

例1:看下面的几个字段

void testEndianMem(){
	char a[] = {0x12,0x34};
	short b = 0x5678;
	int c = 0x1a2b3c4d;
}


栈的按照地址的反方向增长,故存放到内存的情况应该是: 先存a,再存b,再存c。 因此c的地址最小,其次是b,其次是a。

内存中的情况如下图所示:

单独看a,因为存放的类型是字节长度,故按照地址增长方向存放的是12,34。

在看b,b是两字节的类型,x86是小端,所以低地址存放最低字节,应该存放78,然后再存放56。

在看a,a是一个四字节的类型,x86是小端,所以低地址存放低字节,就应该先存放4d,然后接下来是3c,2b,1a。

例2: 我们已经知道各种长度类型的字段如果存到内存中了。

下面的例子看如果已经知道了内存中的内容。那么对于不同类型的指针,它是如何解释并输出的?

void testEndian(){
	char array[12] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
	
	short *pshort = (short *)array;
	int *pint = (int *)array; 
	printf("%x\n",*(pshort+1));	//0x0403
	printf("%x\n",*(pint+1));	//0x08070605
}

很明显,我们已经可以知道对于array数组来说,因为都是字节类型,所以在内存中的存放顺序严格按照这里的顺序递增,即和地址增长方向保持一致。

那么这几个print语句会打印什么呢?

对于第一个打印语句,我们的指针是short型的,所以编译器认为我们存放的都是short值,会按照short的存储方式来解析。首先指针+1,走到03开始的位置,然后因为是小端,所以认为高字节在高地址处,低字节在低地址处,所以输出0x0403。(04是高字节,在高地址处,03是低字节,在低地址处)。

同理可以知道int类型的指针解释出来就是0x08070605。

分享到:
评论

相关推荐

    网络字节序和主机字节序

    常见的有两种字节序:Little Endian(小端字节序)和 Big Endian(大端字节序)。Little Endian 将低序字节存储在起始地址,而 Big Endian 将高序字节存储在起始地址。 Little Endian 最符合人的思维的字节序,因为...

    本地字节序和网络字节序.pdf

    Intel x86架构的CPU采用的就是小端字节序。 2. **大端字节序(Big Endian)**:与小端相反,大端字节序中高位字节存储在内存的低地址处,而低位字节则存于高地址处。十六进制数`0x12345678`在大端模式下会存储为`12...

    大端序和小端序

    "大端序和小端序" 大端序和小端序是计算机科学中的一种概念,用于描述多字节数据在内存中的存储顺序。这种顺序对于跨平台和网络程序非常重要,因为不同的平台和网络协议可能使用不同的字节序。 字节序可以分为两类...

    字节序与位序

    根据存储方法的不同,字节序可以分为两种:大端字节序(Big Endian)和小端字节序(Little Endian)。 大端字节序是指将多字节整数的最高位字节存储在最低位字节地址的方法。例如,在一个 32 位整数中,将最高位...

    JAVA网络字节序转换1

    主要有两种字节序:Big-Endian(大端字节序)和 Little-Endian(小端字节序)。 1. **大端字节序(Big-Endian)**: 大端字节序是指数据的最高有效字节存储在最低地址。例如,4字节的数字0x01020304,在Big-Endian...

    c++和python如何实现主机字节序和网络字节序的相互转换

     主机字节序是自己的主机内部,内存中数据的处理方式,要么是大端,要么是小端,取决于处理器类型和操作系统类型,和编程语言无关,如何判断主机的主机字节序是大端还是小端,请参见网络编程:主机字节序和网络...

    S7-200SMART任意连续字节的数据高低字节调换的具体方法汇总.docx

    在不同的系统中,如CPU、内存或网络传输中,大端序(Big-Endian)和小端序(Little-Endian)的使用可能会不同,因此需要进行高低字节转换。本文将详细讲解如何在S7-200SMART PLC中实现这一操作。 首先,理解高低...

    基于大端法、小端法以及网络字节序的深入理解

    字节序分为两种主要类型:大端法(Big-Endian)和小端法(Little-Endian)。这两种方式的命名源自吉普斯兰故事《格列佛游记》中的两个对立部落,它们争论鸡蛋应从小头还是大头打破,这里的"端"对应于字节的高低位。 ...

    判断CPU大小端模式的经典方法

    判断CPU端模式的经典方法主要有两种,这里通过C语言编程实例进行介绍。 方法一:利用指针和数据类型转换 ```c int CheckEndian(void) { unsigned int num = 0x000000FF; // 定义一个初始值为0x000000FF的无...

    stm32f103的4字节转float和float转4字节代码

    需要注意的是,不同架构的CPU可能对浮点数的表示方式有不同的字节序,即“大端”(Big-Endian)和“小端”(Little-Endian)。STM32F103通常是小端字节序,但如果你需要在不同字节序的系统间交换数据,可能需要进行...

    c语言检测cpu大小端模式

    通过定义一个包含整型和字符型的共用体,我们可以利用这个特性来判断CPU的字节序。 **代码实现**: ```c bool IsLittleEndian() { union w { int a; char b; } c; c.a = 1; return (c.b == 1); // 若处理器是...

    关于.txt总结

    根据描述,我们主要讨论两种字节序:小端字节序(Little Endian)和大端字节序(Big Endian),这两种字节序在不同的处理器架构中有不同的应用。 #### 小端字节序(Little Endian) 小端字节序的特点是将低字节存储...

    火山PC字节集操作源码.rar

    有大端字节序(Big-Endian)和小端字节序(Little-Endian)两种,大端模式下高字节在前,小端模式下低字节在前。在跨平台编程时,字节序的处理尤为关键。 2. **字节操作函数**:源码中可能包含一系列如`read_byte()...

    stm32 crc32校验程序 支持32位int整型字节对齐 大小端

    为了确保程序在大小端系统上都能正确工作,你需要在写入数据到CRC单元前,根据系统字节序进行适当的调整。例如,对于32位整型,如果系统是大端,你需要先将高位字节输入CRC单元,再输入低位字节;反之,如果是小端...

    CPU的大端小端了解一下 硬件工程师电路分析物联网模电单片机嵌入式技术.doc

    这种差异主要与处理器架构有关,不同的CPU家族可能采用不同的字节序。例如,PowerPC和IBM架构通常采用大端模式,而X86(包括常见的Intel和AMD处理器)和某些嵌入式平台如ARM(在某些配置下)使用小端模式。新能源...

    tex-swizzle.rar_little

    在实际应用中,处理小端字节序的代码可能会涉及网络通信(因为网络协议通常定义为大端字节序,称为网络字节序),跨平台数据交换,或者在CPU和GPU之间传输数据时。而纹理Swizzling则可以帮助开发者实现更灵活的图像...

    c语言小端存储

    例如,在网络通信中,TCP/IP协议通常采用大端存储方式,而在本地内存中可能是小端存储,这就需要进行字节序转换。 2. **性能影响**:虽然大端存储符合人类的认知习惯,但小端存储方式更有利于CPU的数据处理,特别...

    网络协议的封包与拆包方法

    首先,字节序是指多字节数据在内存中的存储顺序,分为大端序(big-endian)和小端序(little-endian)两种模式。大端序指的是数据的高位字节存储在低地址处,而小端序则是高位字节存储在高地址处。在网络通信中,...

    大端模式和小端模式的概念,区别以及优缺点

    大端模式(Big-Endian)和小端模式(Little-Endian)是两种不同的字节序,它们决定了多字节数据(如整数、浮点数)在内存中的存储顺序。理解这两种模式对于编写跨平台的软件,特别是在网络通信和嵌入式系统设计中至...

Global site tag (gtag.js) - Google Analytics