内存的大小端模式
因为不明白为什么图像的数据会以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字节为单位。整个内存的分布看起来就像是大端模式一样。
将查看内存值的单位调整,如下图:
——————————————————————————————————————————————————————————————————————————————————
看到这里,相信各位看官已经明白了什么是内存的小端和大端分布了。