C语言:浅谈大小端存储模式

  1. 首先说一下大小端的定义:所谓大端(存储)模式,是指把数值的高位字节放在内存的低位地址上,把数值的低位字节放在内存的高位地址上。所谓小端(存储)模式,是指把数值的高位字节放在内存的高位地址上,把数值的低位字节放在内存的低位地址上。

  2. 为什么会有大端小端之分呢?我们知道,一个大于BYTE的数据类型在内存中存放要有先后顺序。对于像char这样的数据类型,本身只占一个字节的大小,不会产生什么问题,但是当数据类型为例如int时,在32bit的系统中,它需要占用4个字节,这时就会产生这4个字节在寄存器中的存放顺序问题。

  3. 下面举个例子具体说明下:

int a=1;//创建一个int型的变量a 那么内存就会给变量a分配32个bit大小的内存
        //二进制序列:00000000000000000000000000000000
        //十六进制序列:00 00 00 01(从左到右依次是从高位字节到低位字节)

而我们在内存中的存储情况实际上是可以低位内存存储高位字节,在此例中 就是低位字节存储的依次是00 00 00 01,也就是大端存储模式。也可以低位内存存储低位字节,在此例中就是低位字节存储的依次是01 00 00 00,也就是小端存储模式。当然也可以不按一定的顺序存储,比如在低位字节存储的依次是00 01 00 00,但这种存储方式取字节的时候也就要按照相应的顺序来取出,比较麻烦,所以一般不推荐。

4.设计小程序来判断当前机器的字节序
此题目一共有两种解决方法,一种是将值为1的int类型变量强制转换为char*型。第二种方法是使用联合类型。下面一一展示给大家

第一种方法,将值为1的int类型变量强制转换为char*型。值为1的int型变量的十六进制序列为00 00 00 01,最低位字节为1,强制转换为char*型,也就是只取最低位的一个字节,则取地址转换后的值如果是1,则是小端存储模式,如果是0,则是大端存储模式。下面是具体实现代码,一共四个,从上到下越来越优化,供大家参考:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    //判断大小端基本思想:创建一个int型变量a=1;1的十六进制序列为00 00 00 01 
    //将变量a取地址后强制转换位char*型,也就是只取第一个字节,那么结果如果返回1,就是小端存储模式,如果返回0,就是大端存储模式
    int a = 1;
    char *p = (char*)&a;
    if (*p == 1)
    {
        printf("小端存储模式\n");
    }
    else
    {
        printf("大端存储模式\n");
    }
    system("pause");
    return 0;
}
#include<stdio.h>
#include<stdlib.h>

int check_sys()
{
    int a = 1;
    char *p = (char*)&a;
    if (*p == 1)//*p为1相当于a的第一个字节为1 返回1 说明是小端存储模式 返回0说明是大端存储模式
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int main()
{
    if (check_sys)
    {
        printf("小端存储模式\n");
    }
    else
    {
        printf("大端存储模式\n");
    }
    system("pause");
    return 0;
}
#include<stdio.h>
#include<stdlib.h>

int check_sys()//不传参数,规定变量的值只能为1
{
    int a = 1;
    char *p = (char *)&a;
    return *p;//因为如果是小端存储模式,*p的值就是1

}
int main()
{
    if (check_sys)
    {
        printf("小端存储模式\n");
    }
    else
    {
        printf("大端存储模式\n");
    }
    system("pause");
    return 0;
}
#include<stdio.h>
#include<stdlib.h>

int check_sys()
{
    int a = 1;
    return (char*)&a;//将a强制转换为char*类型说明取出的是a变量的第一个字节,如果是小端存储模式,则结果为1,如果是大端存储模式,结果是0
}
int main()
{
    if (check_sys)
    {
        printf("小端存储模式\n");
    }
    else
    {
        printf("大端存储模式\n");
    }
    system("pause");
    return 0;
}

第二种方法,即使用联合类型。联合类型,也叫共用体类型, 即成员共用一块空间。我们可以在联合体内定义两个变量, 一个是int型, 一个是char型,
它们共用一块空间, 那么char型变量的存储空间就是int型变量的第一个字节所在的空间。我们将int型变量的值设置为1,然后返回char型类型变量的值, 如果char型变量的值为1,那么就说明是小端存储模式,为0就说明是大端存储模式。下面是具体实现代码,从上到下依次越来越优化供大家参考

#include<stdio.h>
#include<stdlib.h>

//联合类型,成员共用一块空间
union Un
{
    int a;
    char c;
}un;

int main()
{
    un.a = 1;//int类型a的十六进制序列为00 00 00 01
    if (un.c == 1)//成员共用一块空间,所以char型变量c的内存空间也就是int型变量a的第一个内存空间,为1时说明是小端存储模式,为0时说明是大端存储模式
    {
        printf("小端存储模式\n");
    }
    else
    {
        printf("大端存储模式\n");
    }
    system("pause");
    return 0;
}
#include<stdlib.h>

int check_sys()
{
    union Un//联合类型,成员共用一块空间 即变量a和变量c共用同一块空间,所以变量c的内存就是变量a内存的第一个字节
    {
        int a;
        char c; 
    }un;
    un.a = 1;//int型变量a的十六进制序列为00 00 00 01
    return un.c;//如果变量c返回的结果为1 说明是小端存储模式,如果变量c返回的结果为0 说明是大端存储模式
}
int main()
{
    if (check_sys)
    {
        printf("小端存储模式\n");
    }
    else
    {
        printf("大端存储模式\n");
    }
    system("pause");
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值