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

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

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

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

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

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

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻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 与指针直接转换的原因:
  1. 位表示一致性:如前所述,在64位系统中,指针和 unsigned long long 都是64位,它们的位表示可以一一对应。
  2. 数值表示:指针的值是其指向的内存地址,这个地址本质上是一个数值。unsigned long long 作为一种数值类型,可以存储这个地址值。
  3. 系统抽象:在C和C++中,指针被视为一种直接操作内存的机制。而 unsigned long long 提供了一种数值上的抽象,它们之间的转换允许开发者以数值方式理解和处理指针。
  4. 性能考虑:由于指针和 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位)。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 无名管道C语言
  • React native页面突然白屏
  • Mamba+Transformer完美融合,效果炸裂!
  • UE4 SLUA IOS打包报错解决办法
  • Python零基础入门教程
  • WSL和Windows建立TCP通信协议
  • 蓝桥杯 Python 研究生组-2023-省赛-分糖果-深度算法
  • 专业人士如何选?揭秘4款2024年常用的电脑录屏软件!
  • axure10的安装与使用教程,问题整理
  • 基于SpringBoot+Vue的健身俱乐部网站(带1w+文档)
  • 深入理解C语言中的枚举
  • 2024年让短片制作不再难,4款剪辑软件助你一臂之力!
  • 「码」上行动!一物一码+TPM让“多进货多卖货”不再是口号!
  • C/C++进阶 (8)哈希表(STL)
  • 基于Cloudflare搭建私有Docker镜像源
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android单元测试 - 几个重要问题
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • css属性的继承、初识值、计算值、当前值、应用值
  • dva中组件的懒加载
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Java到底能干嘛?
  • js递归,无限分级树形折叠菜单
  • Next.js之基础概念(二)
  • npx命令介绍
  • October CMS - 快速入门 9 Images And Galleries
  • php的插入排序,通过双层for循环
  • Redash本地开发环境搭建
  • 成为一名优秀的Developer的书单
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 基于遗传算法的优化问题求解
  • 漂亮刷新控件-iOS
  • 使用 Docker 部署 Spring Boot项目
  • 协程
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 一天一个设计模式之JS实现——适配器模式
  • 异常机制详解
  • mysql面试题分组并合并列
  • zabbix3.2监控linux磁盘IO
  • 如何用纯 CSS 创作一个货车 loader
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • !!Dom4j 学习笔记
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #includecmath
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (蓝桥杯每日一题)love
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析