简介: 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。