问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言知识小科普之大小端字节序

创作时间:
作者:
@小白创作中心

C语言知识小科普之大小端字节序

引用
CSDN
1.
https://m.blog.csdn.net/zhangw7/article/details/137791686

什么是大小端

在计算机科学中,大小端字节序是一个重要的概念,特别是在处理多字节数据类型时。以int类型为例,C语言中一个int占4个字节,而内存中的存储是以按字节为单位的,那么就存在一个顺序的问题,无非就是按顺序存放,或者按倒序存放嘛。这里所说的大小端字节序简单来讲就是字节在内存中的存放顺序。

  • 大端字节序:把一个数据的低位字节内容放在高地址处,高位字节内容放在低地址处
  • 小端字节序:把一个数据的高位字节内容放在高地址处,低位字节内容放在低地址处

如图所示,假设在内存中一个数据是 0x11223344。因为一个字节是八位,一个十六进制位表示四个二进制位,所以如果按11 22 33 44 存,就是低字节在高地址,高字节在低地址的大端字节序,如果按44 33 22 11 存,就是低字节在低地址,高字节在高地址的小端字节序。

查看大小端字节序

接下来我们通过Visual Studio 2022观察一下我的电脑的数据是怎么存的。请看图!

a=10写成32位二进制序列是00000000 00000000 00000000 00001010 的十六进制是00 00 00 0a我们可以看到在这里 a 的低字节内容 0a 在低地址处,因此是小端存储

上图怎么来的?按 F10(Fn+F10)-> 调试 -> 窗口 -> 内存 -> 随便选一个 -> 输入&a 就可以观察a的地址的变化。

写一个判断大小端的函数

#include<stdio.h>
int CheckSys()
{
    int a = 1;
    char* ret = (char*) & a;
    if (*ret == 1)
        return 1;
    else
        return 0;
}
int main()
{
    int ret = CheckSys();
    if (ret == 1)
        printf("小端\n");
    else if (ret == 0)
        printf("大端\n");
    return 0;
}

解释一下 CheckSys 函数:

a=1 的 32位二进制序列是 00000000 00000000 00000000 00000001,如果是大端字节序则00000001低字节存在高地址处,如果是小端字节序则 00000001低字节存在低地址处,因此只需要拿出 a 的地址来看它存的第一个内容是什么就能判断到底是大端还是小端。

但是一个整型是四个字节怎么单独看它的第一个字节的内容呢,这时就需要用到char类型的指针来保存a的地址,因为char类型占一个字节,用char类型指向a的地址,再解引用,就只能看到那一个字节的内容,再判断这个内容,就很容易得到结果。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号