当前位置: 首页 > news >正文

c语言大小端判断

大小端

文章目录

  • 大小端
    • 前言
      • 1、大端(Big-endian)
      • 2、小端(Little-endian)
      • 3、例子说明
      • 4、使用C语言来实现判断大小端
      • 5、通俗了解大小端
    • 总结

前言

大小端(Endianness)是计算机系统表示多字节数据的一种方式,它决定了多字节数据的存储顺序。在计算机系统中,多字节数据(如32位或64位的整数)的存储方式有两种:大端(Big-endian)和小端(Little-endian)。

  • 为什么要区分大小端?

    不同的处理器和操作系统可能采用不同的端序,所以在进行数据交换时(比如网络通信或读取文件),需要知道数据的端序,以确保正确解析数据。

1、大端(Big-endian)

在大端模式下,数据的最高有效字节(即最左边的那一位)会被存储在内存中的最低地址处,而最低有效字节则会被存储在最高地址处。

例如

使用16进制数0x12345678为例,大端模式下的存储方式如下:

地址从低到高:12 34 56 78

在这里插入图片描述

2、小端(Little-endian)

在小端模式下,数据的最低有效字节会被存储在内存中的最低地址处,而最高有效字节则会被存储在最高地址处。

示例

同样以0x12345678为例,小端模式下的存储方式如下:

地址从低到高:78 56 34 12

在这里插入图片描述

3、例子说明

假设我们有一个32位的无符号整数0x12345678,并且我们想将其存储在内存中。

大端存储

在大端系统中,这个数会被存储为:

内存地址:
0x0000: 12
0x0001: 34
0x0002: 56
0x0003: 78

小端存储

而在小端系统中,同样的数会被存储为:

内存地址:
0x0000: 78
0x0001: 56
0x0002: 34
0x0003: 12

4、使用C语言来实现判断大小端

大多数编程语言都提供了检测和处理端序的API。在C语言中,可以使用htonlhtonsntohlntohs等函数来进行主机字节序和网络字节序的转换。

#include <stdio.h>
int main() {
    unsigned int testValue = 0x1;
    char *testPtr = (char*)&testValue;
    if (*testPtr == 0x1) {
        printf("小端模式\n");
    } else {
        printf("大端模式\n");
    }
    return 0;
}
  1. 定义测试值:定义一个无符号整数testValue并初始化为0x1。

  2. 获取指针:将testValue的地址转换为字符指针testPtr。这样做的目的是为了能够访问这个整数的第一个字节。

  3. 检查第一个字节:通过解引用testPtr来检查存储在最低地址处的字节值。

    • 如果系统是小端模式,那么最低有效字节(0x1)会被存储在最低地址处,因此*testPtr的值会是0x1。
    • 如果系统是大端模式,那么最高有效字节会被存储在最低地址处,而最低有效字节会被存储在最高地址处,因此*testPtr的值不会是0x1。

5、通俗了解大小端

大端

正如我们眼见看到一样,在这里以12345678,在大端中就是12345678和我们看到的一致。

大端就像我们眼睛看到其排列方式是 0x12 34 56 78

小端

小端就返回来在我们看到的是12345678但是在小端中的排列方式是反过来,那么这样就变成了78 56 34 12。

大端就像我们眼睛看到其排列方式是 0x78 56 34 12

总结

本章主要介绍了大小端在内存中排列方式,直观的展示了大小端的格式和区别。

http://www.dtcms.com/a/107234.html

相关文章:

  • 【JavaScript】十三、事件监听与事件类型
  • 95. 费解的开关
  • 密码学基础——古典密码学
  • 云端革命:数字文明的重构与新生
  • int main(int argc, char **argv)C语言主函数参数解析
  • 【AI News | 20250402】每日AI进展
  • JavaScript基础-移动端常见特效
  • 代码训练营day22
  • leetcode 62. Unique Paths
  • Npfs!NpFsdWrite函数和Npfs!NpCommonWrite函数和Npfs!NpWriteDataQueue函数中的DeferredList
  • Python运算符的理解及简单运用
  • 《数字图像处理》教材寻找合作者
  • 【Java NIO】
  • 4.2学习总结 Java:list系列集合
  • 简单路径计数
  • 深度解析Python与ActiveMQ的完美交互
  • CF580B Kefa and Company(滑动窗口)
  • Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
  • 尚语翻译图册翻译|专业图册翻译|北京专业翻译公司推荐|专业文件翻译报价
  • 开发体育赛事直播系统主播认证功能技术实现方案
  • 体重秤PCBA电路方案组成结构
  • 【CSS3】05-定位 + 修饰属性
  • XSS漏洞的分类解释和演示实验
  • dfs(基于BFS的dfs)力扣37.解数独力扣79.单词搜索力扣1219.黄金矿工力扣980.不同路径III
  • linux shell 删除空行(remove empty lines)
  • 12-leveldb优化读性能的方法
  • agent报告
  • Linux命令-inotifywait
  • 继承与组合
  • LlamaIndex实现RAG增强:融合检索(Fusion Retrieval)与混合检索(Hybrid Search)