找回密码
 注册
关于网站域名变更的通知
查看: 67|回复: 0
打印 上一主题 下一主题

存储器的大端模式和小端模式

[复制链接]
  • TA的每日心情
    开心
    2023-5-15 15:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
     楼主| 发表于 2024-10-16 17:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    大端模式:数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
    小端模式:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
    例如,16位宽的数0x1234在小端模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
    而在大端模式CPU内存中的存放方式则为:
    32位宽的数0x12345678在小端模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
    而在大端模式CPU内存中的存放方式则为:
    为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARMDSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
    下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:
    int main()
    7 e6 R$ \5 n( b1 B; l5 Z{7 \5 W5 T+ W( U3 m& I1 @
    short int x;$ G7 J5 S3 i3 ?7 b. P! l$ x1 Y
    char x0,x1;* ^1 k& b1 _* ~* u# L
    x=0x1122;
    8 Z1 A$ s9 v3 k7 c3 k7 `( S: c+ Q' o* g- s& i
    x0=*((char*)&x);             //低地址单元,或者((char*)&x)[0];5 F4 K- S; J; [; l: ]) K0 b. Q
    x1=*((char*)&x + 1);       //高地址单元,或者((char*)&x)[1];
    7 j6 b6 R( t6 L: w$ g: I- o- W
    1 d- @2 ~$ t3 U) Q8 Q1 W/ sprintf("x0=%x/nx1=%x/n",x0,x1);
    ' s- H# T* ]# H# {% D4 `+ o) s7 q/ x}
    % i8 q5 M( d3 v8 {% W若x0=0x11,则是大端模式; 若x0=0x22,则是小端模式。
    ) ^5 y4 c$ ^. k- L" Z8 y
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-9-24 05:18 , Processed in 0.125000 second(s), 27 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表