大小端模式:
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
下面以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value
高地址
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
低地址
高地址
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
--------------
低地址
内存地址 | 小端模式存放内容 | 大端模式存放内容 |
0x4000 | 0x78 | 0x12 |
0x4001 | 0x56 | 0x34 |
0x4002 | 0x34 | 0x56 |
0x4003 | 0x12 | 0x78 |
下面我们来看一下测试代码:
#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,即大端模式.
如果需要,我们可以通过自定义宏对大小端进行转换,如下:
#definesw16(x)\
((short)(\
(((short)(x)&(short)0x00ffU)<<8)|\
(((short)(x)&(short)0xff00U)>>8)))
大小端目前的现状
目前Intel的80x86系列芯片是唯一还在坚持使用小端的芯片,ARM芯片默认采用小端,但可以切换为大端;而MIPS等芯片要么采用全部大端的方式
储存,要么提供选项支持大端——可以在大小端之间切换。另外,对于大小端的处理也和编译器的实现有关,在C语言中,默认是小端(但在一些对于单片机的实现
中却是基于大端,比如Keil 51C),Java是平台无关的,默认是大端。在网络上传输数据普遍采用的都是大端。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。