c语言进阶部分详解(数据在内存中的存储)

大家好,今天要进行梳理的内容是数据在内存中的存储相关内容。

在C语言中,数据在内存中的存储是一个非常重要的概念。了解数据在内存中的存储方式可以帮助我们更好地理解程序的执行过程,优化内存使用,提高程序的性能。


目录

一.数据类型介绍

1.类型的基本归类 

二.整形在内存中的存储 

1 原码、反码、补码 

2. 大小端介绍 

3.利用代码判断大小端

三. 浮点型在内存中的存储 

1.浮点数存储规则 

2.练习 

第二个结果

第三个结果


一.数据类型介绍

我们经常见到和使用的数据类型如下 

char
short
int
long
long long
float
double
//字符数据类型
//短整型
//整形
//长整型 (也可写作long int)
//更长的整形 (也可写作long long int)
//单精度浮点数
//双精度浮点数

需要注意的是:学习过Java的同学们知道有String(字符串类型),但是c语言没有,我们使用字符数组来代替(char arr [ ]).

而对于上述类型所占字节大小,各位可使用sizeof关键字来进行查看

1.类型的基本归类 

整型: 


其中char为整型:在C语言中,char类型可以用来表示字符,每个字符都对应一个整数值。例如,字符'A'对应的整数值是65,字符'a'对应的整数值是97。这是因为C语言使用了ASCII编码,将字符映射为整数值
 


浮点型: 


 构造类型:

  •  数组类型
  •  结构体类型 struct
  •  枚举类型 enum
  •  联合类型 union

指针类型:

  • int *pi;
  • char *pc;
  • float* pf;
  • void* pv;

空类型:

空类型(void)是一种特殊的类型,表示“无类型”或“没有值”。void类型通常用于以下几个方面:

  1. 函数返回类型:当函数不返回任何值时,可以将其返回类型声明为void。例如,一个不返回值的函数可以定义为void func()

  2. 函数参数类型:当函数不接受任何参数时,可以将其参数列表声明为void。例如,一个不接受参数的函数可以定义为void func(void)

  3. 指针类型:void指针是一种通用指针类型,可以指向任何类型的数据。void指针可以通过强制类型转换(类型转换操作符)转换为其他类型的指针。例如,void* ptr可以指向任何类型的数据。

  4. 函数指针类型:void函数指针可以指向任何类型的函数。例如,void (*funcPtr)()是一个指向不返回值的函数的指针。

需要注意的是,void类型的变量不能直接声明和初始化,因为它没有具体的值。它只能用于函数返回类型、函数参数类型或指针类型的声明


二.整形在内存中的存储
 

一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的

而且整型数据在内存中的存储方式涉及到原码、反码和补码的概念
 

1 原码、反码、补码
 

计算机中的整数有三种2进制表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位
正数的原、反、补码都相同
负整数的三种表示方法各不相同、

  • 原码:原码是整数的二进制表示形式,最高位表示符号位,0表示正数,1表示负数。例如,+5的原码为00000101,-5的原码为10000101
  • 反码:反码是对原码按位取反(符号位除外)得到的结果。正数的反码与原码相同,负数的反码是将原码中的1变为0,0变为1。例如,+5的反码为00000101,-5的反码为11111010
  • 补码:补码是对反码加1得到的结果。正数的补码与原码相同,负数的补码是将反码中的1加1。例如,+5的补码为00000101,-5的补码为11111011

对于整型来说,数据存放内存中其实存放的是补码
因为:计算机使用补码表示有符号整数可以解决0的表示问题以及减法运算的简化,原码和反码没有办法解决多个0的问题(10000000和00000000均可表示0)


2. 大小端介绍
 

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存高地址中。

 

这里我们可以看到,位于数据低位的44在地址里也是低位,所以VS019是小端存储 

3.利用代码判断大小端

我们当然也可以写一段代码来判断大小端 

int check_sys()
{int i = 1;return (*(char*)&i);
}
int main()
{int ret = check_sys();if (ret == 1){printf("小端\n");}else{printf("大端\n");}return 0;
}

  1. 在函数check_sys()中,定义了一个整型变量i并初始化为1。
  2. 然后使用类型转换,将i的地址强制转换为char类型的指针,并通过解引用操作符*访问该地址所指向的字节值(即内存中最低处的值)。
  3. 返回该字节值,即返回i的最低有效字节。
  4. main()函数中,调用check_sys()函数,并将返回值赋给变量ret
  5. 使用条件语句判断ret的值,如果等于1,则输出"小端",表示当前系统是小端序;如果等于0输出"大端",表示当前系统是大端序

三. 浮点型在内存中的存储
 

1.浮点数存储规则 

 根据国际标准IEEE,任意一个二进制浮点数V可以表示成下面的形式:

  • (-1)^S * M * 2^E
  • (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数
  • M表示有效数字,大于等于1,小于2
  • 2^E表示指数位

eg:

十进制的5.0,写成二进制是 101.0 ,相当于 1.01×2^2
按照上面V的格式,可以得出S=0,M=1.01,E=2
十进制的-5.0,写成二进制是 -101.0 ,相当于 -1.01×2^2 。那么,S=1,M=1.01,E=2


 对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M

 

 对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M


IEEE 754对有效数字M和指数E,还有一些特别规定

1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。
IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字

以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字

而对于E的情况就更加复杂了

  • E为一个无符号整数(unsigned int)
  • E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047
  • 但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数
  • 对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001

然后,指数E从内存中取出还可以再分成三种情况

  1. 全为0

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,
有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于
0的很小的数字
 

     2.全为1

这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)

    3.不全为1或0

这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将
有效数字M前加上第一位的1。
比如:
0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为
1.0*2^(-1),其阶码为-1+127=126,表示为
01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进
制表示形式为:  0 01111110 00000000000000000000000
 


2.练习 

int main()
{int n = 9;float* pFloat = (float*)&n;printf("n的值为:%d\n", n);printf("*pFloat的值为:%f\n", *pFloat);*pFloat = 9.0;printf("更改后n的值为:%d\n", n);printf("更改后*pFloat的值为:%f\n", *pFloat);return 0;
}

结果倒是让人大跌眼镜:


 第一个和最后一个大家应该没有疑问,那我们主要来分析第二个和第三个结果

第二个结果

整型9的补码是00000000000000000000000000001001 

从float指针的角度来看:0 00000000 00000000000000000001001  其中S=0,E=1-127,M=00000000000000000001001,符合上面E全是0的情况,结果非常非常小,所以是0.000000

第三个结果

9.0即是1001.0(二进制后几位)-> 1.001*2^3-> S=0   E=3+127   M=1.001

M的有效位是001,后面要补全20个0

最终二进制的呈现:0 10000010 001 0000 0000 0000 0000 000(刚好就是1091567616

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/85770.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《论文阅读13》Efficient Urban-scale Point Clouds Segmentationwith BEV Projection

一、论文 研究领域&#xff1a; 城市级3D语义分割论文&#xff1a;Efficient Urban-scale Point Clouds Segmentationwith BEV Projection论文链接 注&#xff1a; BEV&#xff1a; Birds Eye View BEV投影是指鸟瞰视角(Birds Eye View,简称BEV)的一种从上方观看对象或场景的…

gin和gorm框架安装

理论上只要这两句命令 go get -u gorm.io/gorm go get -u github.com/gin-gonic/gin然而却出现了问题 貌似是代理问题&#xff0c;加上一条命令 go env -w GOPROXYhttps://goproxy.cn,direct 可以成功安装 安装gorm的数据库驱动程序 go get -u gorm.io/driver/mysql

go错误集(持续更新)

1.提示以下报错 Build Error: go build -o c:\Users\Administrator\Desktop__debug_bin2343731882.exe -gcflags all-N -l . go: go.mod file not found in current directory or any parent directory; see ‘go help modules’ (exit status 1) 解决办法&#xff1a; go …

AJAX-笔记(持续更新中)

文章目录 Day1 Ajax入门1.AJAX概念和axios的使用2. 认识URL3.URL的查询参数4.常用的请求方法和数据提交5.HTTP协议-报文6.接口文档7.form-serialize插件8.案例用户登录 Day2 Ajax综合案bootstrap弹框图书管理图片上传更换背景个人信息设置 Day3 AJAX原理XMLHttpRequestPromise封…

机器学习笔记:李宏毅ChatGPT:生成式学习的两种策略

1 策略1 “各个击破”——autoregressive model “各个击破”——一个一个生成出来 2 策略2 &#xff1a; “一次到位”——non-autoregressve model 一步到位&#xff0c;全部生成出来 2.1 non-autoregressive model 如何确定长度&#xff1f; 两种策略 策略1&#xff1a;始…

【1572. 矩阵对角线元素的和】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3]…

MATLAB | 绘图复刻(十一) | 截断的含散点及误差棒的分组柱状图

hey大家好久不见&#xff0c;本期带来一篇绘图复刻&#xff0c;居然已经出到第11篇了&#xff0c;不知道有朝一日有没有机会破百&#xff0c;本期绘制的是《PNAS》期刊中pnas.2200057120文章的figure03&#xff0c;文章题目为Intranasal delivery of full-length anti-Nogo-A a…

数据库新闻速递 -- POSTGRESQL 正在蚕食数据库市场 (翻译)

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &#xff0c;在新加的朋友会分到3群&#xff…

HTML详解连载(1)

HTML详解连载&#xff08;1&#xff09; HTML定义HTML 超文本标记语言标签语法注意拓展 HTML基本骨架解释VS Code 快速生成骨架&#xff1a;标签的关系父子关系&#xff08;嵌套关系&#xff09;兄弟关系&#xff08;并列关系&#xff09; 代码格式注释 标题标签标签名:h1-h6(双…

分布式数据库视角下的存储过程

存储过程很好呀&#xff0c;那些用不好的人就是自己水平烂&#xff0c;不接受反驳&#xff01;我就有过这样念头&#xff0c;但分布式数据库&#xff0c;更倾向少用或不用存储过程。 1 我从C/S时代走来 C/S架构时代的末期最流行开发套件是PowerBuilder和Sybase数据库&#xf…

unity vscode 代码关联 跳转 BUG

一早打开电脑发现代码关联失效了&#xff0c;目测可能跟昨天一些插件更新有关 结论 就这货&#xff0c;开了就没法提示代码关联&#xff0c;估计预览版全是BUG。 另一个坑 同期有个unity插件也是预览版&#xff0c;“非常好使”&#xff0c;当场去世。评论点开有好几个人说用…

【C++面向对象】--- 继承 的奥秘(上篇)

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

第三篇|金融人数据来源有哪些

数据对于金融行业真的很重要&#xff0c;那么金融人有哪些途径查数据呢&#xff1f; 国内&#xff1a; 1. 国家统计局 这个应该是无论什么行业都使用最频繁的网站&#xff0c;每个月都会固定发上个月资产投资数据 、工业增加值和利润数据等常规数据&#xff0c;其他数据也会…

半关闭、端口复用与IO多路复用

文章目录 半关闭端口复用IO多路复用&#xff08;IO多路转接&#xff09;模型解决措施 sellect缺点 poll应用缺点 epoll应用工作模式 半关闭 使用close(fd);所对应的文件描述符写和读都关闭了。 端口复用 可以解决绑定失败的问题。 IO多路复用&#xff08;IO多路转接&#…

【二分+贪心】CF1665 C

Problem - C - Codeforces 题意&#xff1a; 思路&#xff1a; 一开始想太简单wa6了 只想到先感染大的分量&#xff0c;然后最后把最大的分量剩下的染色 但是可能会有别的分量更大&#xff08;因为最后给最大的染色之后可能不再是最大的&#xff09; 可以用堆维护&#xf…

加载并绘制时间域内的心电图信号,并实施Q因子为1的陷波滤波器以去除50 Hz频率研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Cadvisor+InfluxDB+Grafan+Prometheus(详解)

目录 一、CadvisorInfluxDBGrafan案例概述 &#xff08;一&#xff09;Cadvisor Cadvisor 产品特点&#xff1a; &#xff08;二&#xff09;InfluxDB InfluxDB应用场景&#xff1a; InfluxDB主要功能&#xff1a; InfluxDB主要特点&#xff1a; &#xff08;三&#…

SpringBoot案例-部门管理-删除

目录 查看页面原型&#xff0c;明确需求 页面原型 需求 阅读接口文档 思路分析 功能接口开发 控制层&#xff08;Controllre类&#xff09; 业务层&#xff08;Service类&#xff09; 持久层&#xff08;Mapper类&#xff09; 接口测试 前后端联调 查看页面原型&a…

AWS-自定义ami的S3存取使用

需要提前配置好aws-cli哈 对应的区域 要统一 示例&#xff1a;即AWS-CLI 和 EC2、AMI、S3以上资源均要使用同已区域&#xff0c;以下拿新加坡举例 1.新建自定义AMI 2.查看ami状态 确认是可用状态&#xff0c;才能开始操作 3.aws-cli 开始存入s3 只能使用桶的根目录 开始上…

Python-OpenCV中的图像处理-直方图

Python-OpenCV中的图像处理-直方图 直方图统计直方图绘制直方图Matplotlib绘制灰度直方图Matplotlib绘制RGB直方图 使用掩膜统计直方图直方图均衡化Numpy图像直方图均衡化OpenCV中的直方图均衡化CLAHE 有限对比适应性直方图均衡化 2D直方图OpenCV中的2D直方图Numpy中2D直方图 直…