关于大小端字节序

首先这里的大端小端是一种计算机的储存模式。下来我们来看看它是什么东西。
大端模式(大端字节序):字数据的高字节储存在低地址中,而字数据的低字节则存放在高地址中。
小端模式(小端字节序):字数据的高字节储存在高地址中,而字数据的低字节则存放在低地址中。
在这里我们以整形为例子:a=20;
我们知道20的二进制是 00000000 00000000 00000000 00010100
十六进制是 00(高位) 00 00 14(低位)
大端模式: (低地址) 00 00 00 14(高地址)
小端模式: 14 00 00 00
比如这么一段简单的代码,你知道a是怎么储存的吗?

#include<stdio.h>
int main()
{
    int a = 20;
    system("pause");
    return 0;
}

这里我们可以这样查看内存进行&a来看我们是大端还是小端模式查看内存
我们可以通过很多方法得到我们是大端模式还是小端模式。
当然我们可以直接通过上面直接看内存的方式得到。
但是如果不看内存应该怎么知道是哪种模式,是大端字节序还是小端字节序呢?
方法1:
我们先来分析一下就拿刚讲过的a=20为例子
我们知道20的二进制是 00000000 00000000 00000000 00010100
十六进制是 00(高位) 00 00 14(低位)
大端模式: (低地址) 00 00 00 14(高地址)
小端模式: 14 00 00 00
在这里我们要知道int型占四个字节而八个比特位表示一个字节
char型占一个字节
我们可以看到两种模式低地址不一样,那么我们是不是可以判断低地址的值来判断呢?
我们可以定义一个值a=1,为什么让a=1呢?
我们可以看到 a的16进制是 00 00 00 01
如果是小端模式的话低地址就是01,相反就是00
那我们把b的地址拿出来然后让a的地址强制类型转换,char b=(char )&a;因为char *占一个字节,所以只取了内存的最低字节00或01,如果最后b==1的话,就说明低地址存的低位,就是小端,否则就是大端。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int a = 1;
    char * b = (char *)&a;
    if (b == 1)
        printf("小端!");
    else
        printf("大端!");

    system("pause");
    return 0;
}

方法二:
这个方法我们要用到联合体union。
关键字union
主要性质是:在union中所有的数据成员共用一个空间,同一时间只能储存其
中一个数据成员,所有的数据成员具有相同的起始地址。
知道了他的性质怎么用它判断大小端呢?
因为union中的结构成员具有相同的起始位置,和方法中原理差不多,还是因为int
占四个字节,而char只占一个字节,我们可以在union结构中定义一个int类型,
一个char类型,然后我们给整形赋值为1,un.i=1,因为char只占一个字节而又
共用同一空间所以不得已,char类型变量只能取低地址然后我们再判断char类型变量
是1还是0,从而判断是大端还是小端。

#include<stdio.h>
int main()
{
    union un
    {
        int i;
        char c;
    }c;
    c.i = 1;
    if (c.c == 1)
    {
        printf("小端");
    }
    else
    {
        printf("大端");
    }

    system("pause");
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值