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

C语言之unsigned long long与struct相互转换实例(五十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

新书发布:《Android系统多媒体进阶实战》🚀
优质专栏: Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏: 多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2.unsigned long long与struct相互转换介绍
      • 从 `unsigned long long` 到 `struct` 的转换
      • 从 `struct` 到 `unsigned long long` 的转换
      • 注意事项
    • 🌻3.代码实例
      • 🐓3.1 结构体转unsigned long long并输出

🌻1.前言

本篇目的:C语言之unsigned long long与struct相互转换实例

🌻2.unsigned long long与struct相互转换介绍

  • unsigned long long 是一种数据类型,用于表示无符号的64位整数。而 struct 是一种构造数据类型,可以将多个不同类型的数据项组合成一个单一的复合类型。在C/C++中,将 unsigned long longstruct 相互转换通常涉及到位操作和内存布局的考虑。

unsigned long longstruct 的转换

  • unsigned long long 转换为 struct 需要确保 struct 的大小不超过8字节,并且成员的排列方式要与64位整数的位模式兼容。转换过程中,可以直接将 unsigned long long 的位模式复制到 struct 的内存中。这种转换通常通过 memcpy 函数实现,该函数会将源地址的数据按字节复制到目标地址。

structunsigned long long 的转换

  • struct 转换为 unsigned long long 的过程与上述相反。同样需要使用 memcpy 函数,将 struct 的内存内容复制到 unsigned long long 类型的变量中。这个过程中,struct 的每个成员的位模式将被重新解释为一个64位的整数。

注意事项

  • 在进行 unsigned long longstruct 的相互转换时,需要注意以下几点:
  1. 结构体的大小:确保 struct 的大小不超过8字节,否则转换可能会导致数据丢失或未定义行为。
  2. 内存布局:struct 的成员布局必须与64位整数的位模式兼容。这包括成员的顺序、大小和对齐方式。
  3. 数据对齐:某些平台对数据对齐有严格要求,不正确的对齐可能会导致性能下降或程序崩溃。
  4. 可移植性:由于不同编译器或平台可能对内存布局有不同的处理方式,直接操作位模式的转换代码可能不具备可移植性。
  5. 类型兼容性:确保 struct 的每个成员类型与 unsigned long long 的位宽度兼容,避免数据截断或扩展。
  • 通过这些转换,可以在不同的数据表示之间灵活切换,以适应特定的编程需求或优化目的。然而,由于涉及到底层的内存操作,这种转换应该谨慎使用,并在充分理解其潜在风险的情况下进行。

🌻3.代码实例

🐓3.1 结构体转unsigned long long并输出

#include <stdio.h>
#include <string.h>typedef struct TEST{int count;char str[64];
}TEST;int main(){TEST tt = {100,"Happy Every Day!"};unsigned long long ul = (unsigned long long)(&tt);printf("count = %d, str = %s\n",((TEST*)ul)->count,((TEST*)ul)->str);
}
  • 注意:ul存放的是结构体地址&tt,在64位平台,它占8个byte。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于 systemc-2.3.1的virtual device 接入 qemu-arm
  • 深入解析 KMZ 文件的处理与可视化:从数据提取到地图展示项目实战
  • 计算几何 点乘 两点间距离 两向量夹角
  • C++ STL copy_backward, move_backward 用法
  • B3952 [GESP202403 一级] 小杨买书
  • python实现图像分割算法4
  • AI人工智能开发环境配置
  • 【人工智能】NLP入门指南:自然语言处理基础全解析
  • 计算机毕业设计选题推荐-学生作业管理系统-Java/Python项目实战
  • 工作纪实54-git使用ssh方式
  • 【第一章】软件测试人员的成长技能树:打造全方位的技能体系
  • PHP 表单处理基础
  • NVIDIA A100 和 H100 硬件架构学习
  • springboot集成RabbitMQ
  • 16进制转换-系统架构师(三十九)
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • express如何解决request entity too large问题
  • JS 面试题总结
  • Python_OOP
  • Redis 中的布隆过滤器
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • tweak 支持第三方库
  • vue-router 实现分析
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 后端_ThinkPHP5
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 小李飞刀:SQL题目刷起来!
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 移动端高清、多屏适配方案
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • $.proxy和$.extend
  • (1)STL算法之遍历容器
  • (C++)八皇后问题
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十八)三元表达式和列表解析
  • (四)JPA - JQPL 实现增删改查
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • 、写入Shellcode到注册表上线
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • @component注解的分类
  • [ IO.File ] FileSystemWatcher
  • [@Controller]4 详解@ModelAttribute
  • [Angularjs]ng-select和ng-options
  • [BZOJ1178][Apio2009]CONVENTION会议中心