判断机器的大小端模式

  

<强>

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

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

下面以unsigned int value=https://www.yisu.com/zixun/0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用无符号字符缓冲区[4]来表示值

大端法:低地址存放高位,如下:

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

低位优先:低地址存放低位,如下:

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

低地址

内存地址小端模式存放内容大端模式存放内容0 x40000x780x120x40010x560x340x40020x340x560x40030x120x78


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

# include   # include   int8_t  isBigEndian ()   {   ,,,   ,,,{   ,,,,,,,int ,我;   ,,,,,,,char , c;   ,,,}测试;/*   * storage 方法   ,* little 尾数法):10000000   ,* big 尾数法:,,,,00000010   ,*/,,,test.i =, 2;//0 x00000010   ,,,printf (“test 小姐:addr: % x \ t  test  c  addr: % x \ n",, test.i,, test.c);   ,,,printf (“test 我:x % \ tlength: % d \ t  test  c: % x \ t 长度:% d \ n", test.i, sizeof (test.i) test.c, sizeof (test.c));   ,,,return , test.c  !=, test.i;   }   void  main ()   {   ,,printf (“% x \ n", isBigEndian ());   }

运行结果如下:

test 小姐:addr: d4f20b80 ,,,, test  c  addr: test 小姐:addr: d4f20b80 ,,,, test  c  addr: d4f20b80   test 我:2,,,,长度:4,,,,,test  c: 2,,,,,长度:1   0

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


如果需要,我们可以通过自定义宏对大小端进行转换,如下:

<代码类=" cpp预处理器"> # definesw16 (x) \   ((短)(\   (((短)(x)和(短)0 x00ffu) & lt; & lt; 8) | \   (((短)(x)和(短)0 xff00u)在祝辞8)))

<强>

,,,,目前英特尔的80 x86系列芯片是唯一还在坚持使用小端的芯片,手臂芯片默认采用小端,但可以切换为大端;而MIPS等芯片要么采用全部大端的方式   储存,要么提供选项支持大端,可以在大小端之间切换。另外,对于大小端的处理也和编译器的实现有关,在C语言中,默认是小端(但在一些对于单片机的实现   中却是基于大端,比如凯尔51 c), Java是平台无关的,默认是大端。在网络上传输数据普遍采用的都是大端。<代码类=" cpp平原">


判断机器的大小端模式