位域 内存 字节序_大端序与小端序——字节序与位域的存储

谈到字节序的问题,必然牵涉到两大CPU派系——Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big-endian(大端序、大字节序、高字节序)方式存储数据,而x86系列则采用little-endian(小端序、小字节序、低字节序)方式存储数据。

何为大端序和小端序?

大端序:字数据的高字节存储在低地址中。

小端序:字数据的低字节存储在低地址中。

其实这两个概念不难理解,但是比较容易记混。由于大端序和小端序都是从存储器的低地址开始向高地址存储数据,不同的是一个字数据中先存高字节还是先存低字节。可以记住这样一个口诀:“高大低小”。“高”是指高字节,“大”是指大端序,“低”是指低字节,“小”是指小端序,“高大低小”也即先存高字节为大端序,先存低字节为小端序。

举个常见的例子。

位宽为32bit的CPU,要存储的字数据为0x1234abcd,起始地址为0x4000。

大端序:

地址

0x4000

0x4001

0x4002

0x4003

内容

0x12

0x34

0xab

0xcd

小端序:

地址

0x4000

0x4001

0x4002

0x4003

内容

0xcd

0xab

0x34

0x12

以上是字节域中,比较容易理解。

下面说一下在位域中。

先看一个例子。

1 typedef structtagExp2 {3 WORD bit4:4;4 WORD bit3:3;5 WORD bit2:2;6 WORD bit7:7;7 } Example;8

9 union10 {11 Example tExp;12 WORD result;13 } Test;14

15 Test.tExp.bit4 = 10;16 Test.tExp.bit3 = 5;17 Test.tExp.bit2 = 1;18 Test.tExp.bit7 = 8;

Test.Result输出是多少呢?

答案是,在Intel CPU上得到的结果为0x10da,在MPC8560 CPU得到的结果为0xaa88。

下面来分析一下。

在Intel CPU中,采用的是little-endian,从存储器的低字节开始存储,在一个字节中,从低位开始存储,低bit位存储在低bit地址。也即

(图中,yellow-bit4,green-bit3,blue-bit2,white-bit7)

在MCP8560 CPU中,采用的是big-endian,同样从存储器的低字节开始存储,而在一个字节中,是从高位开始存储,高bit位存储在高bit地址。也即

(图中,yellow-bit4,green-bit3,blue-bit2,white-bit7)

位域比字节域更深层了一步,是从bit的角度解释了大端序和小端序。

综合起来,就是两句话。

高大低小:先存高字节为大端序,先存低字节为小端序。

高高低低:大端序先把高bit位存储在高位地址,小端序先把低bit位存储在低位地址。

最后附加一个常用的C程序来判断是大端序还是小端序。

1 boolcheckCPU()2 {3 union4 {5 inta ;6 charb ;7 } c;8

9 c.a = 1;10

11 return(c.b == 1)12 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值