C 语言编程 — 大小端区分

目录

文章目录

  • 目录
  • 大端、小端
  • 区分方式 1
  • 区分方式 2

大端、小端

大端:高位字节放在内存的低地址端,低位字节放在内存的高地址端,CPU 对操作数的存放方式从高字节到低字节。

小端:低位字节放在内存的低地址端,高位字节放在内存的高地址端,CPU 对操作数的存放方式从低字节到高字节。

假设我们的内存是这样的:
C 语言编程 — 大小端区分_第1张图片

我们要存一个数据 0x44332211 到这块内存里面去如果系统是 小端模式 的话,存储方式如下图:
C 语言编程 — 大小端区分_第2张图片

如果系统是 大端模式 的话,存储方式如下图:
C 语言编程 — 大小端区分_第3张图片

区分方式 1

通过判断内存的低地址是否为 1 来区分大小端:指针类型转换,将长度大的 int 类型转换为长度小的 char 类型,最后再取 char* 指针的值,就知道数据 1 存放在高端地址还是低端地址了。

#include 


int main()
{
    int i = 1;
    (*(char*)&i == 1) ? printf("Little-endian\n") : printf("Big-endian\n");
    return 0;
}

区分方式 2

利用共用体的特点:使用长度最大的那个数据类型作为共用体的大小。所以,char a 使用的是 int b 的空间大小,判断 a 的值,也就是判断低地址的数据值。

#include 


union System {
    char a;
    int b;
};

int main()
{
    union System s;

    s.b = 1;
    printf("0x%x\n", &s.a);
    printf("0x%x\n", &s.b);

    if (s.a == 1) {
        printf("Little-endian\n");
    } else {
        printf("Big-endian\n");
    }

    return 0;
}

你可能感兴趣的:(C,语言)