简简又单单的大小端序

大端序(Big Endian),高地址存放低位数据,低地址存放高位数据
小端序(Little Endian),高地址存放高位数据,低地址存放低位数据
在一台模式固定的计算机中,无论是存放还是读取数据,都是采用同一种模式进行,但由于某些特殊的数据结构,对大小端序的实现会产生误解.

数组

c语言中的数组相当于连续的内存空间,且根据下标,地址依次递增

example:数组的内存分配
char a[]={"1234"};
    for (int i=0;i<4;i++) {
        printf("%#08x",&a[i]);std::cout << std::endl;
    }
    std::cout << std::endl;
    int x[]={1,2,3,4};
    for (int i=0;i<4;i++) {
        printf("%#08x",&x[i]);std::cout << std::endl;
    }
输出结果
0xe0fff94b
0xe0fff94c
0xe0fff94d
0xe0fff94e

0xe0fff930
0xe0fff934
0xe0fff938
0xe0fff93c

由于char类型数组,每个数据的大小为1Byte,所以地址依次增加1,而int类型数组,每个数据的大小为4Byte,所以地址在递增时会依次递增4.

example:数组内的内存分配
x[0]=0x11234A11,x[1]=0x25678B22,x[2]=0x39012C33,x[3]=0x43456D44;
    for (int i=0;i<4;i++) {
        char* p=(char*)&x[i];
        printf("%#04x ",*p);
        printf("%#04x ",*(p+1));
        printf("%#04x ",*(p+2));
        printf("%#04x",*(p+3));
        std::cout << std::endl;
    }
输出结果
0x11 0x4a 0x23 0x11
0x22 0xffffff8b 0x67 0x25
0x33 0x2c 0x01 0x39
0x44 0x6d 0x45 0x43
//或者使用动态调试也能查看在堆上的分配情况

image
可以看到,在每一个单位内,为其申请了4个字节的长度,并且每个数据按照小端序的顺序存储
当我们使用char类型的指针进行读取时,指向的是数组的低地址,并且依次加1,把数据进行了逆序读取

连续的数据
char a[]="1234";
int* b=(int *)a;
    printf(a);
    std::cout << std::endl;
    printf("0x%x",*b);
输出结果
1234
0x34333231

此时的char类型数组相当于char类型的指针,可以看作一段连续的数据,与scanf("%s")所达到的目的相同,将数据存储进了一片连续的空间内,再一次使用int类型指针读取,按照小端序的模式,即得到逆序排列的数据.

posted @ 2024-07-24 12:06  Cia1lo  阅读(10)  评论(0编辑  收藏  举报