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

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

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

在计算机系统里,数据存储有大端和小端两种模式。大端模式是高字节存在低地址,小端模式是低字节存在低地址。下面结合相关知识,用两种 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(int argc,char const * argv[]) 
{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.wxhsa.cn/company.asp?id=6974

相关文章:

  • CSP-S模拟23
  • CF1413F Roads and Ramen
  • 复现The Annotated Transformer代码时遇到的问题和相关链接
  • Node.js 文件上传中文文件名乱码难题,为什么只有Node会有乱码困难,其他后端框架少见?
  • ROS2之节点
  • 9.17日总结
  • ECT-OS-JiuHuaShan 框架,元推理AGI奇迹
  • Mapper与Mapper.xml的关系
  • Rocky Linux10.0安装zabbix7.4详细步骤 - 教程
  • 【P3158】放棋子 - Harvey
  • 最强AI语音克隆和文本配音工具!与真人无异,CosyVoice下载介绍
  • 近日C++线上练习结果
  • 密力根油滴实验实验报告
  • Linux 系统插入U盘/移动硬盘实现自动挂载
  • 来点人瑞平我
  • 【P2051】中国象棋 - Harvey
  • JavaDay6
  • Ubuntu Linux 云服务器常见安全漏洞修复方法汇总 Apache/OpenSSH/DNS
  • AI智能体开发实战:从提示工程转向上下文工程的完整指南
  • 解码C语言九条语句
  • 多个 root 用户记录,而且有些记录的密码是空的,导致认证混乱。
  • 解题报告-P11670 [USACO25JAN] Cow Checkups S
  • word vba 对 带编号格式的PO单 段落下添加对应的图片
  • 解题报告-P11671 [USACO25JAN] Farmer Johns Favorite Operation S
  • 解码C语言运算符
  • 多进程
  • 93. 递归实现组合型枚举
  • Sort方法学习(伪代码记录)
  • 深入解析:【每日一问】运算放大器与比较器有什么区别?
  • 9.17支配对问题专题总结