大端模式与小端模式
一、介绍
超过一个字节的数据在内存中会用几个字节存储,根据数据在内存的存放方式,分大端模式和小端模式。
大端模式是将数据的高位存在内存的低位地址;小端模式而是将数据的高位存在内存的高位地址,以下是十六进制0x12345678在内存地址的两种存储方式(假设数据是按原码存储),0x12345678中,12是高位,78是低位。
大端模式中把高位(12)存在内存低地址(0x000),而在小端模式中,高位(12)却存在高地址(0x003),所以按字节去读取一个超过一个字节类型的数据时,小端方式将会出错,如图中读int类型的0x12345678将读出为0x78563412。大小端模式是由机器指令决定的,Intel系列一般是有小端模式,在处理网络传递数据时,特别要注意客户端和服务器所使用的模式。
二、查看自己的机器使用的模式
写一个简单的程序可以查看自己的机器是使用大段模式还是小端模式,安刚才的分析,我们只要以字节为单位去读取一个长度超过一个字节的数,看是否与原来的数相同,就可以断定是哪种模式。
#include <stdio.h> /* *按字节打印start[i]-start[len-1]的数据 */ void show_byte(char * start,int len){ int i; for(i=0;i<len;i++) printf("%.2x",start[i]); printf("\n"); } int main(){ int test = 0x12345678; char * pointer = (char*) &test;//强制转换成char* show_byte(pointer,sizeof(int)); return 0; }
在我的机器上输出的是78563412,说明是小端模式。
三、在实践中的应用
大小端模式处理不当,会早造成数据乱码,但我目前没碰到这个问题,以后碰到在补上。