欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

大小端模式详解及其测定

程序员文章站 2022-04-22 12:08:15
...

大小端的寓言故事

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

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

相关标签: 大小端 C语言