MENU

字节序的理解

前言

最近一直在看《深入理解计算机系统》补充基础知识,看到有关介绍大端小端的介绍,下面就做个总结。

详细

  • 大端:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。(符合我们平时的读写字符数值)
  • 小端:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

举例:如数组0x2356,高位为:0x23 低位为:0x56,在内存的存放如下。

内存地址 小端模式 大端模式
0x5000 0x56 0x23
0x5001 0x23 0x56
  • 为什么会有大小端模式之分?

    因为计算机系统中是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型。另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于 大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。
    摘自百度百科

程序中大端小端判断

## 方法一
int i = 1;   
char *p = &i;   
if(*p == 1)     
    printf("little-endian"); 
else // (*p == 0)
    printf("big-endian");
    
## 方法二 借助union联合体,由于联合体存放顺序是所有成员按照低地址存放。
int checkCPUendian()
{
    union {
        int a;
        char b; 
    } c;
    c.a = 1;
    return (c.b == 1); 
}
结果:1 --> little-endian   0 --> big-endian
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码