qt-union-联合体基础讲解

目录

简介

在C++中,通过联合体(union)实现double到字节数组的转换并处理大小端问题,是一种高效的类型双关(Type Punning)技术。

  • 联合体(union)的作用
    • 内存共享:联合体DoubleConverter的d(double类型)和i(quint64类型)共享同一块内存。当converter.d = value时,converter.i会存储该double值的二进制表示(IEEE 754标准)。
    • 类型双关:通过联合体,可以绕过C++的严格类型检查,直接操作double的底层字节。
  • 大小端切换原理
    • 大端序(Big-Endian):高位字节存储在低地址。代码中,converter.i的高位字节(如>>56)依次放入bytes0到bytes7
    • 小端序(Little-Endian):低位字节存储在低地址。代码中,converter.i的高位字节放入bytes7,低位字节放入bytes0
  • 代码逻辑解析
cpp 复制代码
union DoubleConverter {
    double d;
    quint64 i;
};

QByteArray doubleToQByteArray(double value, bool bigEndian) {
    DoubleConverter converter;
    converter.d = value;  // 将double值存入联合体
    
    QByteArray bytes;
    bytes.resize(8);  // 确保8字节空间
    
    if (bigEndian) {
        // 大端序:高位字节在前
        bytes[0] = (converter.i >> 56) & 0xFF;  // 最高有效字节
        // ... 依次填充高位字节
        bytes[7] = converter.i & 0xFF;          // 最低有效字节
    } else {
        // 小端序:低位字节在前
        bytes[7] = (converter.i >> 56) & 0xFF;  // 最高有效字节存末尾
        // ... 依次填充低位字节
        bytes[0] = converter.i & 0xFF;          // 最低有效字节存开头
    }
    return bytes;
}

为什么处理的是i而不是d?

  • 直接操作字节:double类型在C++中不可直接进行位运算(如移位、掩码)。通过联合体将其转换为quint64,可以逐字节操作内存表示。
  • IEEE 754兼容性:double的二进制布局符合IEEE 754标准,quint64的位操作能精确控制每个字节的顺序。

举例

以double value = 3.1415926535为例:

  • 大端序输出:40 09 21 FB 54 44 2D 18(高位字节在前)。
  • 小端序输出:18 2D 44 54 FB 21 09 40(低位字节在前)。

建议

  • 平台兼容性:联合体的行为在C++中属于实现定义(implementation-defined),但大多数编译器(如GCC、Clang、MSVC)支持此用法。
  • 字节顺序:确保发送方和接收方约定一致的大小端格式,避免数据解析错误。
  • 精度问题:double的二进制表示可能因平台浮点数精度差异导致细微误差,需在协议层明确精度要求。
    通过联合体和位操作,该方案高效实现了double到字节数组的转换,并支持灵活的大小端切换,适用于网络传输、文件存储等场景。
相关推荐
江湖人称菠萝包24 分钟前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter2-GUI应用程序设计基础
笔记·qt·qt5
nvvas1 小时前
Java 入门(四):数组——数据的集合管理
java·开发语言
重生的黑客1 小时前
Qt 常用控件精讲(1):QWidget 核心属性全解 —— 从 geometry 到 qrc 与 QSS
c++·qt·qwidget·qss·常用控件
江湖人称菠萝包2 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter1-认识Qt
笔记·qt·qt5
Y3815326622 小时前
SERP 数据清洗实战:字段标准化、日期解析与去重键
开发语言·数据库·python·python数据库
君顾12 小时前
本地城市低空经济管理系统定制:城市级低空运营平台架构与落地实战
java·开发语言·飞手
多多鼠3 小时前
System Prompt 的“版本漂移”问题:从变更管理到 A/B 测试体系
开发语言·网络·人工智能·python·langchain
WiChP3 小时前
【V0.1B16】从零开始的2D游戏引擎开发之路
开发语言·算法·游戏引擎
孙启超4 小时前
【AI开发之Rust】第 8 课:泛型、trait 与 trait 对象
开发语言·后端·rust
2501_933670794 小时前
经营财务岗技能栈拆解:Excel、SQL、BI、预算分析怎么准备
开发语言