大小端模式
原创
©著作权归作者所有:来自51CTO博客作者chisj的原创作品,请联系作者获取转载授权,否则将追究法律责任
大小端模式指的是什么?
大端模式:是数据的高字节保存在底地址中,而数据的底字节保存在高地址中。
小段模式:数据的高字节保存在高地址中,而数据底字节保存在底地址中。
为什么会有大小端模式之分?
因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(根据编译器的位数,通过sizeof(long)获取),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节。那么就必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
例如一个16bit的short型X,在存储中的地址为0x0010,X的值为0x1234,那么0x12为高字节,0x34位低字节。对于大端模式,就将0x12存储在低地址中,即0x0010中,0x22存储在高地址中,即0x0011中。小端模式刚好相反。
如何判断设备是大小端模式?
#include <stdio.h>
// typedef unsigned char byte;
void main()
{
int a = 0x12345678;
// 取低地址的值
char *p = (char *)(&a);
// 判断低地址的值和低字节的值是否相等
if (*p == 0x78)
{
// 低地址存储低字节的值就是小端模式
printf("little!\n");
}
else if (*p == 0x12) // 判断低地址的值和高字节的值是否相等
{
// 低地址的值存储高字节的值就是大端模式
printf("big!\n");
}
else
{
printf("other!\n");
}
getchar();
}
大小端目前的使用情况?
目前Intel的80x86系列芯片是唯一在坚持使用小端的芯片,ARM芯片默认采用小端,但是可以切换为大端;而MIPS等芯片要么采用全部大端的大端存储,那么提供选项支持大端--可以在大小端之间切换。另外,对于大小端的处理也和编译器的实现由关,在C语言中,默认是小端(但在对于一些单片机的实现中确实基于大端,比如Keil 51C),Java是平台无关的,默认是大端的。在网络上传输数据普遍也是大端模式。