C语言简单判断是大端还是小端(字节序)以及网络字节序

39 篇文章 15 订阅
  • 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
  • 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

 简单来说,就是:

  • 小端——地址存储位,高地址存储高位
  • 大端——地址存储位,高地址存储低位

判断原理:

使用char指针,或者联合体,读取一段内存中的当前字节(8比特)数据,和下一个字节数据,由于读取内存时,都是从低地址往高地址读取数据。所以读取到的第一个字节数据是低地址的,第二个数据是高地址的。

通过比较这两个数据,就能判断是大端小端

 示例程序:

使用了两种方法:char类型指针和联合体

#include<stdio.h>
#include <stdbool.h>
union Utest
{
    short num;
    char c;
}Utest;
int main(void)
{
    // printf("%d\n",sizeof(1==1));
    short i = 0x1122;
    char* a = (char *)(&i);
    printf("%p\n",a);//低地址
    printf("%x\n",*a);//22,低位

    printf("%p\n",(a+1));//高地址
    printf("%x\n",*(a+1));//11,高位
    //说明是小端
    union Utest u;
    u.num = 0x5566;
    printf("%x\n",u.c);//66,66是低位,读取内存时,是从低地址到高地址
    //低地址中存储的是地位,因此是小端
    return 0;
}

 在win10+VS2017+x64环境下结果:

00000095382FF774
22
00000095382FF775
11
66

在Ubuntu20.04+gcc9.3.0环境下结果:

0x7ffc8badffcc
22
0x7ffc8badffcd
11
66

 可见都是低地址存储了数据的低位,因此是小端模式。

参考文章:

顶级C程序员之路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SOC罗三炮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值