简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
 新书发布:《Android系统多媒体进阶实战》🚀
  优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀
  优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀
  优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

 
🍉🍉🍉文章目录🍉🍉🍉
- 🌻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 long与- struct相互转换通常涉及到位操作和内存布局的考虑。
从 unsigned long long 到 struct 的转换
 
- 将 unsigned long long转换为struct需要确保struct的大小不超过8字节,并且成员的排列方式要与64位整数的位模式兼容。转换过程中,可以直接将unsigned long long的位模式复制到struct的内存中。这种转换通常通过memcpy函数实现,该函数会将源地址的数据按字节复制到目标地址。
从 struct 到 unsigned long long 的转换
 
- 将 struct转换为unsigned long long的过程与上述相反。同样需要使用memcpy函数,将struct的内存内容复制到unsigned long long类型的变量中。这个过程中,struct的每个成员的位模式将被重新解释为一个64位的整数。
注意事项
- 在进行 unsigned long long与struct的相互转换时,需要注意以下几点:
- 结构体的大小:确保 struct的大小不超过8字节,否则转换可能会导致数据丢失或未定义行为。
- 内存布局:struct的成员布局必须与64位整数的位模式兼容。这包括成员的顺序、大小和对齐方式。
- 数据对齐:某些平台对数据对齐有严格要求,不正确的对齐可能会导致性能下降或程序崩溃。
- 可移植性:由于不同编译器或平台可能对内存布局有不同的处理方式,直接操作位模式的转换代码可能不具备可移植性。
- 类型兼容性:确保 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。

















