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

6. C语言大小端字节序存储以及存储形式判断

程序员文章站 2022-04-18 18:48:26
...

  C语言中数据是存储在内存中的,而内存空间又被划分为以字节为单位的连续地址空间,那么,我们定义的变量是在内存中如何存储的呢。

我们把变量在内存中的存储分为两种,大端字节序存储与小端字节序存储。

1. 小端字节序存储

  数据的低字节存储在低地址处,高字节存储在高地址处。

2. 大端字节序存储

  数据的低字节存储在高地址处,高字节存储在低地址处。

3. 为什么会有⼤⼩端模式之分

  这是因为在计算机系统中,我们是以字节为单位的,每个地
址单元都对应着⼀个字节,⼀个字节为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则为⼤端模式。很
多的ARM, DSP都为⼩端模式。有些ARM处理器还可以由硬件来选择是⼤端模式还是⼩端
模式。

4. 判断大小端存储方式

  那了解完了存储的方式,那我们怎么区分所使用机器是大端存储还是小端存储呢,接下来我们设计一个程序来区分机器是何种字节序存储。

```
    // plan 1 普通方法
    int check_sys1() {
        int a = 1;
        return *(char*)&a;
        /*
            返回0,大端模式
            返回1,小端模式
        */
    }

    // plan 2 利用联合
    int check_sys() {
        union Un {
            char c;
            int i;
        }u;
        u.i = 1;
        return u.c;
    }

    int main(){
        int a = 1;
        int ret = check_sys1();
        // ret = check_sys2();
        if(ret == 1) {
            printf("小端\n");
        } else if(ret == 0) {
            printf("大端\n");
        }
        return 0;
    }

对于联合的概念不清楚的可以参考

C语言基本数据类型及构造数据类型,浮点型存储规则及内存模型