判断机器的大小端模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断机器的大小端模式相关的知识,希望对你有一定的参考价值。

大小端模式:

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

下面以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value

Big-Endian: 低地址存放高位,如下:

高地址
  ---------------
  buf[3] (0x78) -- 低位
  buf[2] (0x56)
  buf[1] (0x34)
  buf[0] (0x12) -- 高位
  ---------------
  低地址

Little-Endian: 低地址存放低位,如下:

高地址
  ---------------
  buf[3] (0x12) -- 高位
  buf[2] (0x34)
  buf[1] (0x56)
  buf[0] (0x78) -- 低位
  --------------

低地址

内存地址小端模式存放内容大端模式存放内容
0x40000x780x12
0x40010x560x34
0x40020x340x56
0x40030x120x78


下面我们来看一下测试代码:

#include<stdlib.h>
#include<stdio.h>
int8_t isBigEndian()
{
    union
    {
        int  i;
        char  c;
    }test;
/*
 *storage methods
 *little endian: 10000000
 *big endian:    00000010
 */
    test.i = 2; //0x00000010
    printf("test i addr:%x\t test c addr:%x\n",&test.i,&test.c);
    printf("test i:%x\tlength:%d\t test c:%x\t length:%d\n",test.i,sizeof(test.i),test.c,sizeof(test.c));
    return  test.c != test.i;
}
void main()
{
  printf("%x\n",isBigEndian());
}

运行结果如下:

test i addr:d4f20b80     test c addr:test i addr:d4f20b80     test c addr:d4f20b80
test i:2    length:4     test c:2     length:1
0

从结果中可以看出,成员c和i是低字节对齐的,并且他两的值都是2,但他们的长度却不一样,说明i的低字节存储在i的首地址中,也就是按照低字节的方式存储的,即小端模式.返回0.同理如果返回1,则说明他们是按照高字节的方式存储,返回1,即大端模式.

以上是关于判断机器的大小端模式的主要内容,如果未能解决你的问题,请参考以下文章

判断机器大小端模式的方法

C++怎么判断大小端模式

如何简单的判断机器的大小端字节序

如何简单的判断机器的大小端字节序

经典笔试题:用C写一个函数测试当前机器大小端模式

C语言%u%d打印的规则数据在内存中的存储及大小端存储模式