0

0

c++中如何判断系统是大端还是小端_c++检查字节序的方法【详解】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-23 17:54:16

|

515人浏览过

|

来源于php中文网

原创

最轻量常用方法是union检测:写入0x01020304后读bytes[0],值为0x04则小端,0x01则大端;C++20可用std::endian编译期判断;指针转换有未定义行为风险;宏定义仅反映编译目标,非运行时真实序。

c++中如何判断系统是大端还是小端_c++检查字节序的方法【详解】

用联合体(union)快速检测字节

最轻量、最常用的方法是定义一个 union,把整数和字节数组共用同一块内存,然后写入一个非对称值(如 0x01020304),再读取第一个字节判断高低位分布。

  • 小端系统下,0x01020304 在内存中低地址存 0x04,所以 bytes[0]0x04
  • 大端系统下,低地址存最高字节,bytes[0]0x01
  • 该方法不依赖编译器扩展,C++98 起就完全合法
union EndianTest {
    uint32_t value;
    uint8_t bytes[4];
};
EndianTest test;
test.value = 0x01020304;
if (test.bytes[0] == 0x04) {
    // 小端
} else if (test.bytes[0] == 0x01) {
    // 大端
}

std::endian(C++20)直接查标准枚举

C++20 引入了 std::endian 枚举,在编译期就能确定字节序,无需运行时检测,且可配合 if constexpr 做零开销分支。

  • std::endian::little 表示小端,std::endian::big 表示大端
  • std::endian::native 是当前平台实际字节序,多数情况等于前两者之一
  • 注意:部分老编译器(如 GCC 10 或 Clang 11 之前)可能未完全支持,需确认 __cpp_lib_endian
#include 
#if __cpp_lib_endian >= 201907L
    if constexpr (std::endian::native == std::endian::little) {
        // 编译期已知小端
    }
#endif

用指针强制类型转换(简单但有未定义行为风险)

有人会写 *reinterpret_cast(&value) 取首字节,这在绝大多数编译器上能工作,但严格来说违反 C++ 严格别名规则(strict aliasing),可能被优化掉或触发未定义行为。

  • GCC/Clang 在 -O2 下可能把这类读取优化成常量,导致误判
  • 若必须用指针方式,请搭配 volatilememcpy 绕过别名限制
  • 相比 union 方案,它没有语言标准背书,可移植性差

跨平台宏定义(预编译判断)不等于运行时真实字节序

__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 这类宏,是编译器根据目标平台设定的,一般可靠,但要注意:

Figstack
Figstack

一个基于 Web 的AI代码伴侣工具,可以帮助跨不同编程语言管理和解释代码。

下载

立即学习C++免费学习笔记(深入)”;

  • 交叉编译时,宏反映的是目标平台,不是构建机,这点没问题
  • 但若程序加载了运行时决定的外部数据(如网络字节流、硬件寄存器映射),仍需以实际内存布局为准,不能只信宏
  • 某些嵌入式平台(如 ARM 的 BE8 模式)支持运行时切换字节序,此时宏值固定,而实际行为可变

真正关键的不是“系统是什么端”,而是“当前这段内存按什么顺序解释”,后者永远以运行时实测为准。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1491

2023.10.24

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

763

2023.08.22

c语言union的用法
c语言union的用法

c语言union的用法是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型,union的使用可以帮助我们节省内存空间,并且可以方便地在不同的数据类型之间进行转换。使用union时需要注意对应的成员是有效的,并且只能同时访问一个成员。本专题为大家提供union相关的文章、下载、课程内容,供大家免费下载体验。

125

2023.09.27

java进行强制类型转换
java进行强制类型转换

强制类型转换是Java中的一种重要机制,用于将一个数据类型转换为另一个数据类型。想了解更多强制类型转换的相关内容,可以阅读本专题下面的文章。

284

2023.12.01

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

69

2025.10.23

C++类型转换方式
C++类型转换方式

本专题整合了C++类型转换相关内容,想了解更多相关内容,请阅读专题下面的文章。

299

2025.07.15

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

9

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

18

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4.8万人学习

Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号