C语言之unsigned long long与指针相互转换实例(五十五)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
新书发布:《Android系统多媒体进阶实战》🚀
优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🍉🍉🍉文章目录🍉🍉🍉
- 🌻1.前言
- 🌻2.指针的本质和unsigned long long介绍
- 🌻3.代码实例
- 🐓3.1 char *或char buf[]转unsigned long long类型
- 🐓3.2 char *或char buf[]通过memcpy转unsigned long long类型
- 🐓3.3 如何判断系统是64位,还是32位?
🌻1.前言
本篇目的:C语言之unsigned long long与指针相互转换实例
🌻2.指针的本质和unsigned long long介绍
- 在C和C++等编程语言中,
unsigned long long
与指针类型之间可以直接相互转换,这是因为它们在底层有着相似的表示方式。以下将详细介绍这种转换的可行性及其背后的原因。 - 首先,指针的本质是内存地址。在大多数现代计算机系统中,内存被组织为一个线性地址空间,每个内存地址对应一个唯一的位置。指针变量存储的是内存中某个对象的地址。
- 在32位系统中,指针通常占用4个字节(32位)。
- 而在64位系统中,指针则占用8个字节(64位)。
unsigned long long
是一种无符号整型,它通常也是64位的,能够表示的数值范围是0到2的64次方减1。- 在64位系统中,
unsigned long long
与指针类型在大小上是一致的,都是8个字节。 - 因此,从存储的角度来看,它们在二进制表示上具有相同的位数,这使得它们之间的转换在技术上成为可能。
- 以下是几个支持
unsigned long long
与指针直接转换的原因:
- 位表示一致性:如前所述,在64位系统中,指针和
unsigned long long
都是64位,它们的位表示可以一一对应。 - 数值表示:指针的值是其指向的内存地址,这个地址本质上是一个数值。
unsigned long long
作为一种数值类型,可以存储这个地址值。 - 系统抽象:在C和C++中,指针被视为一种直接操作内存的机制。而
unsigned long long
提供了一种数值上的抽象,它们之间的转换允许开发者以数值方式理解和处理指针。 - 性能考虑:由于指针和
unsigned long long
在内存中的表示相同,它们之间的转换不需要改变内存中的位模式,这意味着这种转换通常可以在不损失性能的情况下快速进行。
- 需要注意的是,虽然技术上可以转换,但这种转换并不总是有意义。指针转换成
unsigned long long
后,就失去了指针的类型信息,这可能导致后续操作不安全。例如,如果错误地将一个普通的整数值当作指针使用,可能会访问到非法的内存地址,引发程序崩溃。 unsigned long long
与指针之间的直接转换在技术上是可行的,因为它们在内存中的表示方式相同,都是64位的数值。指针的本质是内存地址,而unsigned long long
提供了一种可以存储这些地址的数值类型。不过,这种转换应当谨慎使用,以避免潜在的安全风险。
🌻3.代码实例
🐓3.1 char *或char buf[]转unsigned long long类型
#include <stdio.h>
#include <string.h>int main(){char buf[16] = "Hello World!";//Or//char *buf = "Hello World!";//v1.0unsigned long long ull = (unsigned long long)buf;//int ull = (int)buf;//errorprintf("ull = %s\n",(char*)ull);
}
🐓3.2 char *或char buf[]通过memcpy转unsigned long long类型
int main(){char buf[16] = "Hello World!";//Or//char *buf = "Hello World!";unsigned long long ull1 = 0;//ok//int ull1 = 0;//okmemcpy(&ull1, buf, strlen(buf)+1);//使用strlen(buf)+1来包括字符串的终止符printf("ull1 = %s\n", (char*)&ull1);
}
🐓3.3 如何判断系统是64位,还是32位?
int main(){void* p = 0;if(sizeof(p) == 8)printf("OS is 64 bit!\n");else if(sizeof(p) == 4){printf("OS is 32 bit!\n");}
}
- 在32位系统中,指针通常占用4个字节(32位)。
- 而在64位系统中,指针则占用8个字节(64位)。