【ARM 嵌入式 C 入门及渐进 8-- Linux CPU大小端介绍及判断方法】

文章目录

    • 1.1 大小端概念
      • 1.1.1大小端判断方法一
      • 1.1.2 大小端判断方法二

1.1 大小端概念

大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中。
小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来。

我们常用的 X86 结构是小端模式,而 KEIL C51则为大端模式。很多的ARM,DSP 都为小端模式。

有些ARM处理器还可以随时在程序中(在ARM Cortex 系列使用REV、REV16、REVSH 指令 [1] )进行大小端的切换。

1.1.1大小端判断方法一

#define TRUE 1
#define FALSE 0

int is_bigendian()
{
    int  i = 1;            // i = 0x00000001
    char  c = *(char *)&i; // 注意不能写成 char c = (char)i;
    return  (int )c != i;
}

如果是 little endian 字节序 i = 1;的内存从低到高依次放的是:0x01 0x00 0x00 0x00
按照 i 的起始地址变成按照 char * 方式(1字节)存取,从低地址开始取值,即得 c = 0x01;反之亦然。

1.1.2 大小端判断方法二

Cunion 里面的成员char cint i 都是从低地址开始对齐的,所以如果是小端模式低地址的值为 0x2, 若果是大端模式低地址的值是 0x0

int is_bigendian()
{
    union {
      int i;
      char c;
    } test;
    
    test.c = 0x2;
    return  test.i != 2; //不等于2,返回true,是大端模式
}

你可能感兴趣的:(#,嵌入式,C,常用算法,c语言,linux,arm开发)