内存的大小端模式

因为不明白为什么图像的数据会以BGR而不是RGB的方式存放到内存中,扯出了以前在计算机组成原理中学习过的内存大小端模式。记录下来,方便以后再复习。

 

在计算机系统中,内存的管理以字节为单位,1 byte=8 bit,一个字节的内容在内存中的存放顺序是固定的。

在C语言中,很多类型大小超过了1byte,例如int通常是4byte,多个字节的数据在内存中可以用两种方式对齐来排放,这两种方式就是大端模式和小端模式。

如:0x12345678 

其中0x12是高位的数据,0x78是低位数据。

在内存中,可以按照地址的大小分为低地址和高地址

                内存地址           大端模式             小端模式

低地址   |0x00440000|   0x12      0x78

      |0x00440001|   0x34      0x56

      |0x00440002|   0x56      0x34

高地址   |0x00440003|   0x78      0x12

1.小端模式(Little-Endian)就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。(x86采用小端模式  )
2.大端模式(Big-Endian)  就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。(在内存和字符串的排列一致,在内存中排列符合我们的习惯)

各自的优点就是对方的缺点:

小端模式:强制转换数据不需要调整字节内容;

大端模式:符号位的判定固定为第一个字节,容易判断正负。

 用一段C++确定是大端还是小端:

int a=0x1234;
	char b=*(char *)&a;
	if(b==0x12)
		std::cout<<"big-endian"<<std::endl;
	else
		std::cout<<"little-endian"<<std::endl;

  

参考博文:http://blog.csdn.net/ce123_zhouwei/article/details/6971544

————————————————————————————————————————————

在Visual studio中,可以参看内存值:

注意,下图的测试是在intel 的x86架构下,内存以小端分布。

 

但请注意,小端分布是有单位的,这里设置了以4字节为单位。整个内存的分布看起来就像是大端模式一样。

将查看内存值的单位调整,如下图:

 

 

 

——————————————————————————————————————————————————————————————————————————————————

看到这里,相信各位看官已经明白了什么是内存的小端和大端分布了。

原文地址:https://www.cnblogs.com/wangpei0522/p/3750390.html