大小端模式详解及其测定

大小端的寓言故事

有关大小端的争论,最早来自于《格列夫游记》里一个有趣的故事:

Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚。然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了王位,产生叛乱的原因就是另一个国家Blefuscu的国王大臣煽动起来的,叛乱平息后,就逃到这个帝国避难。据估计,先后几次有11000余人情愿死也不肯去打破鸡蛋较小的端吃鸡蛋。这个其实讽刺当时英国和法国之间持续的冲突。

什么是大小端

目前普遍采用的是单字节编址方式,即对于每一个字节(8个位)编一个地址编号,这种方式对于单字节数据存储没有问题,但多字节的数据存储会带来问题,比如:要将整形 0x 87 65 43 21 (占四个字节)存储在其起始地址为 100处,是将高位 87 存储在高地址 103 处,还是将 21 存储在 103 处,这是一个问题。

  • 将数据的高位存储在低地址处的方式称为大端模式
  • 相反的,将数据的低位存储在低地址处的方式称为小端模式

这样对于 0x 87 65 43 21 就有两种存储方式:
这里写图片描述

大小端的测定

下面给出两种测试方法(C语言):

  • 用一个 char 的指针取得 int 的第一个字节, 通过查看 char 对应的是 int 的高位数据还是低位数据,从而得出结果。代码如下:
#include <stdio.h>

int main()
{
    int i = 0x87654321;
    char *cp = (char*)&i;
    printf("%d\n", *cp);

    return 0;
}

结果如下:
这里写图片描述

  • 通过联合体的特点:所有成员共享同一内存,来达到测试目的。代码如下:
#include<stdio.h>

int check()
{
    union{
        int i;
        char c;
    }ic;
    ic.i = 0x87654321;

    return ic.c == 0x21;
}
int main()
{
    if (check())
        printf("小端模式\n");
    else
        printf("大端模式\n");

    return 0;
}

结果如下:
这里写图片描述


【作者:果冻 http://blog.csdn.net/jelly_9

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值