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

  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语言基本数据类型及构造数据类型,浮点型存储规则及内存模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值