两种判断计算机大小端模式的方法

news/2025/9/17 21:25:23/文章来源:https://www.cnblogs.com/CreamyKitten/p/19097588

两种判断计算机大小端模式的方法

在计算机系统里,数据存储有大端和小端两种模式。大端模式是高字节存在低地址,小端模式是低字节存在低地址。下面结合相关知识,用两种 C 语言方法判断大小端。

一、知识铺垫

(一)大小端存储规则

  • 大端存储(Big - Endian):数据的高字节存储在内存的低地址。比如整数 0x12345678(4 字节),大端模式下,存储地址从低到高依次是 0x120x340x560x78
  • 小端存储(Little - Endian):数据的低字节存储在内存的低地址。还是整数 0x12345678,小端模式下,存储地址从低到高依次是 0x780x560x340x12
    一般 X86 架构采用小端模式,ARM 架构一般采用大端模式(但不绝对)。
    image

(二)printf 长度修饰符

printf 的长度修饰符用于指定输出整数对应的参数类型,只影响输出内容,不改变数据本身。

  • hh:后续整数转换对应 signed charunsigned char 参数(针对输出,取整数低 1 字节)。
  • h:后续整数转换对应 short intunsigned short int 参数(针对输出,取整数低 2 字节)。

(三)联合体特性

联合体变量的成员共用一块内存,每个成员起始地址相同。修改联合体中任意一个成员的值,都会影响其他成员的值,且不应同时对多个成员赋值。

二、判断方法

(一)利用 printf 长度修饰符

我们借助 printf 函数的 hh 长度修饰符,它能将整数转换为 unsigned char 类型输出,只取整数的低 1 字节,通过输出结果判断大小端。
代码如下:

#include <stdio.h>
int main() {// 输出 0x12345678 的低 1 字节printf("%#hhx\n", 0x12345678);return 0;
}
  • 若输出 0x12,说明是大端模式,因为大端模式下低地址存储高字节 0x12
  • 若输出 0x78,说明是小端模式,因为小端模式下低地址存储低字节 0x78
    像 X86 架构(小端模式)运行这段代码,可能输出 0x78;ARM 架构(一般大端模式),可能输出 0x12
    image
    可以知道该机器是数据的低位放在低地址空间,数据的高位放在高地址空间,因此是小端模式。

(二)使用联合体(Union)

利用联合体成员共用内存的特性,定义一个包含 int 类型和 char 类型成员的联合体。给 int 成员赋值后,通过 char 成员获取低地址存储的字节,进而判断大小端。
代码如下:

#include <stdio.h>
// 定义联合体
union Endian {int a;char b;
};
int main() {union Endian data;// 给 int 成员赋值data.a = 0x12345678;// 判断低地址存储的字节if (data.b == 0x12) {printf("Big - Endian\n");} else {printf("Little - Endian\n");}return 0;
}
  • data.b 的值是 0x12,说明是大端模式,高字节 0x12 存储在低地址。
  • data.b 的值是 0x78,说明是小端模式,低字节 0x78 存储在低地址。

通过这两种方法,能轻松判断当前计算机的大小端模式,这对涉及底层数据存储和网络字节序转换等场景很有帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/906857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROS2之节点

什么是节点? 在ROS2(机器人操作系统2)中,节点(node)是执行程序的基本单元,也是构成整个机器人系统的核心“积木”。你可以把它理解为系统中一个独立、可执行的进程,每个节点都专注于完成一个特定的、单一的功能…

ECT-OS-JiuHuaShan 框架,元推理AGI奇迹

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891 ▮ 推理就绪:基于自然辩证法数学形式化系统启动因果律算符 ECT-OS-JiuHuaShan 框架的诞生,绝非一次普通的技术迭代,它是文明进程中一个前所未有的 “确定…

Mapper与Mapper.xml的关系

Mapper与Mapper.xml的关系简单直接的回答是:它们之间是“接口定义”与“SQL映射实现”的关系。 ManageMapper 是一个 Java 接口,它定义了数据库操作的方法签名;而 ManageMapper.xml 是一个 XML 文件,它提供了这些方…

Rocky Linux10.0安装zabbix7.4详细步骤 - 教程

Rocky Linux10.0安装zabbix7.4详细步骤 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

【P3158】放棋子 - Harvey

题意 有 \(c\) 种棋子,每种棋子都有相应的个数,要把全部棋子放入棋盘中,使得每一行和每一列没有颜色相同的棋子,求方案数。 思路 从行和列的角度显然不好处理,所以我们可以先从颜色的种类入手。 设计 \(f_{c,i,j}…

最强AI语音克隆和文本配音工具!与真人无异,CosyVoice下载介绍

CosyVoice是一个大规模预训练语言模型,深度融合文本理解和语音生成的一项新型语音合成技术,能够精准解析并诠释各类文本内容,将其转化为宛如真人般的自然语音 CosyVoice采用了总共超15万小时的数据训练,依托先进的…

详细介绍:如何在公众号接入海外招聘数据分析智能体

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Linux 系统插入U盘/移动硬盘实现自动挂载

在 /etc/udev/rules.d/ 目录下建立挂载规则 文件名后缀为 xxx.rulesKERNEL=="sd[a-z][1]", ACTION=="add", SUBSYSTEMS=="usb", SUBSYSTEM=="block", RUN{program}+="/u…

来点人瑞平我

不知道自己定位了,来帮助我找找(

在Unity2021中使用Profiler的Deep Profile功能时内存超高怎么办? - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

日总结 2

老师同样为学期初开了个头,没有讲什么重要是知识。我这天完成了Linux的安装和配置,完成了安装hadoop需要的环境配置和jdk的配置,为hbase的使用安装做铺垫。

LeetCode 24. 两两交换链表中的节点 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【P2051】中国象棋 - Harvey

题意 求有多少种棋盘使得每一列和每一行的棋子个数不超过 \(2\) 个。 思路 设计 \(f_{i,j,k}\) 表示前 \(i\) 行,有 \(j\) 列为 \(1\) 个棋子,\(k\) 列为 \(0\) 个棋子。考虑当前行放 \(0\) 个棋子,则有 \(f_{i,j,k…

mysql 8.0查看正在执行的事务锁

SELECT * FROM performance_schema.data_lock_waits; -- MySQL 8.0+ SELECT r.trx_id AS waiting_trx_id, r.trx_mysql_thread_id AS waiting_thread, r.trx_query AS waiting_query, b.trx_id AS blocking_trx_id, b.…

JavaDay6

可变参数JDK1.5开始,Java支持传递同类型的可变参数给一个方法 在方法声明中,在指定参数类型后加一个省略号(...)。 一个方法只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。pa…

基于SpringBoot+Vue的大学生心理互助社区系统设计与建立

基于SpringBoot+Vue的大学生心理互助社区系统设计与建立2025-09-17 20:59 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; …

Ubuntu Linux 云服务器常见安全漏洞修复方法汇总 Apache/OpenSSH/DNS

安全漏洞名称/CVE修复方案1. Apache HTTP Server 缓冲区错误漏洞(CVE-2023-31122)2. Apache HTTP Server 资源管理错误漏洞(CVE-2023-43622)3. Apache httpd 资源管理错误漏洞(CVE-2024-27316)4. Apache HTTP Se…