什么是little-endian and big-endian?这个涉及到CPU两大派系的问题,IBM的CPU,多数RISC的cpu,和MOTO的微处理器采用的是big-endian,Intel的x86系列都是采用little-endian,而ARM同时支持 big和little,实际应用中通常使用little endian。。。所以我们使用的大多数PC都是little-endian了。他们具体的区别何在呢,big-endian是指一个WORD里面的高位BYTE存放在内存中这个WORD区域的低地址处,而little-endian则相反,即一个WORD里面的高位BYTE存放在内存中这个WORD区域的高地址处。这里举个简单的例子,比如存放0x12345678到这两种的CPU当中,内存地址假定从0x0000开始,存放顺序如下:
内存地址 big-endian: little-endian
0x0000 0x12 0x78
0x0001 0x34 0x56
0x0002 0x56 0x34
0x0003 0x78 0x12
可以看出big-endian比较符合人们的思维习惯,而little-endian则。。。。
其实big-endian:little-endian还与网络和java虚拟机有关,因为在网络和java中都是用的big-endian来存放数据,网络字节序其实就是big-endian,所以才会出现htons()此类的函数,这个函数怎么写,如果用宏又怎么写?ntohs呢?atoi呢?汗,怎么突然想到atoi
用宏来写一个吧
#define htons(a) ((a)&0x00ff)<<8)|((a)&0xff00)>>8)
然后是怎么写个程序来判断是little or big
首先这个函数用一个int类型来返回吧,1为little 0为big,-1为error
具体实现的时候采用一个union来放一个unsigned short和两个char的数组,然后取这个ushort是0x0001
int LOrB(){
union {
unsigned short us;
unsigned char uc[2];
}un;
un.us=0x0001;
if(un.uc[0]==1)
return 1;
else if(un.uc[0]==0)
return 0;
else return -1;
}
什么是little-endian和big-endian,如何用程序判断
最新推荐文章于 2021-04-09 14:24:27 发布