C语言--大小端的判断

1.理解认识大小端

什么是大小端?
大小端是指在存储多字节数据时,字节的排列顺序。有两种主要的字节序:大端字节序和小端字节序。

大端字节序: 在大端字节序中,最高有效字节存储在最低的存储地址,而最低有效字节存储在最高的存储地址。

小端字节序: 在小端字节序中,最低有效字节存储在最低的存储地址,而最高有效字节存储在最高的存储地址。

举个例子来说,考虑一个16位整数0x1234在内存中的存储:
大端字节序:存储为 0x12 0x34。
小端字节序:存储为 0x34 0x12。

在计算机体系结构和通信协议中,存在大小端字节序的区别。不同的处理器和系统可能使用不同的字节序,因此在进行数据交换时需要注意字节序的转换。
在这里插入图片描述

2.判断大小端的方法

//a.内存单元法
a.内存单元法:将一个整型变量的地址强制转换为一个字符型指针,然后通过指针访问该变量,再判断该指针所指向的内存单元的值,即可判断该系统的大小端模式。
  代码实现如下:
#include <stdio.h>
int main() 

{
    int num = 1;  // 一个整数,用于判断字节序
    unsigned char* p = (unsigned char*)&num;
    printf("内存单元法判断字节序:\n");

    for (int i = 0; i < sizeof(int); i++)
     {
        printf("内存单元 %d 的值为:%02x\n", i, p[i]);
    }

    if (*p == 1) 
    {
        printf("最低有效字节在最低地址,小端字节序\n");
    }
    else {
        printf("最高有效字节在最低地址,大端字节序\n");
    }

    return 0;
}



b.  通过联合体进行判断大小端
原理:通过联合体中的两个成员共享相同的内存空间,一个成员是整数类型(int),另一个成员是字符类型(char)。然后通过设置整数的值,观察字符成员的值,以此来推测存储在内存中的字节序。

```c
#include <stdio.h>
int main() {
    // 定义一个联合体,包含一个字符成员和一个整数成员
    union {
        char c;  // 字符成员,共享内存空间
        int i;   // 整数成员,共享内存空间
    } u;

    // 将整数成员的值设置为1
    u.i = 1;

    // 判断最低有效字节的内容
    if (u.c == 1)
    {
        printf("小端字节序\n");
    }
    else
    {
        printf("大端字节序\n");
    }

    return 0;
}

c. 数值转换法:将一个数字转换为网络字节序(大端模式)的格式,再将其转换为主机字节序(当前环境的大小端模式),若得到的结果与原始值相同,则表示该系统为大端模式,反之则为小端模式。
``#include <stdio.h>
int main() 
{
    // 定义一个整数,初始值为1
    int num = 1;

    // 获取整数的地址,并将地址强制转换为指向无符号字符的指针
    unsigned char* p = (unsigned char*)&num;

    // 判断最低有效字节的内容
    if (*p == 1) {
        printf("小端字节序\n");
    }
    else {
        printf("大端字节序\n");
    }

    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值