【C语言深度剖析——第四节(关键字4)】《C语言深度解剖》+蛋哥分析+个人理解

追求本质,不断进步
本文由@睡觉待开机原创,转载请注明出处。
本内容在csdn网站首发
欢迎各位点赞—评论—收藏
如果存在不足之处请评论留言,共同进步!

这里写目录标题

  • 一、空间的申请
    • 1.变量定义
      • 1.1变量定义的概念:
      • 1.2变量定义的原因:
    • 2.变量声明
  • 二、数据存入
    • 1.转换补码
    • 2.大小端存储
    • 3.截断
    • 4.取值范围的问题
  • 三、数据取出
    • 1.大小端
    • 2.自身类型
    • 3.整型提升
  • 练习题

前言:
本节博客继续前篇内容进行续写,我们着重探求有符号与无符号数的问题,探求整形在内存中的存储这一课题

在这里插入图片描述

一、空间的申请

1.变量定义

1.1变量定义的概念:

所谓变量定义,本质上就是在内存中开辟特定大小的空间(不做解释,后文体会)。


概念区分:初始化与赋值
(1)概念:
初始化:指的是变量与生俱来的内容属性
赋值:值的是变量后来放到该变量空间的内容属性
(2)特点:
初始化只能进行一次,赋值可以进行多次
初始化具有先天性的含义,赋值有着后天的含义。


1.2变量定义的原因:

定义变量的原因在于开辟空间,暂时存储数据

首先,我们需要明确的是计算机是弥补人类计算能力低下问题诞生的(这里并没有贬低人类的意思,就是说人类跟计算机相比计算能力确实相对来说比较差)
在这里插入图片描述

之后,我们需要明白,我们人类计算时候是需要一步一步计算的,计算机也是需要进行先后计算了,并不是一下子就对所有数据进行处理,计算机也是对一个一个数据进行依次处理的,至于为什么算个数字那么快,因为计算机算的快而已,这并不是说计算机对所有数据进行同时处理。(注:当然计算机也是可以同时对数据进行处理的,不过同时处理数据的能力有限,了解即可)
然后,我们大概就明白了,为何需要变量?就是因为有些数据需要等待一些时间去让计算机处理,在处理之前,需要先存储起来防止数据丢失,这大概跟人类做运算时候要写在纸上差不多,省的忘了原来的数据,如果忘了那就惨了。
在这里插入图片描述

那为啥需要把数据放在一个个变量里进行处理啊?我数据直接放那一团不就行了嘛,这有点类似于我们吃饭,我们一般都是用碗吃饭,而不是直接用锅,原因在于效率高,计算机也是一样,在处理数据的时候,先用变量把在“一锅里的”数据分到一个个小碗里,然后就“吃”的快了。而且之前讲过,我们做饭的地方跟我们吃饭的地方离得距离是比较远的,类似于硬盘中的程序跟cpu处理是比较远的,要想提高效率,就是借助变量变成“小碗”送到内存当中,这样就跟cpu离得近了。其实我感觉变量就是起到了一个方便读取数据的作用。

变量定义的本质在于,开辟一块内存空间,暂时存储数据

2.变量声明

变量声明的本质就是:告知编译器。**
两者的区别在于,
声明你可以声明多次,定义只能定义一次哈。
本质区别在于定义开辟内存空间,变量声明没有开辟内存空间。

这个区别有一个比较有意思的比喻,大概是这样的,变量的定义类似于你跟你女朋友表白,只能表白一次吧?哈哈。然后变量的声明的话就是你告诉你周围的人,那个女孩是我女朋友哈,你们不要有非分之想了哈。这里想说声明可以声明无数次。(这里只是做一个比喻说明一下哈,无任何不良诱导)

二、数据存入

首先同学们,我想问int a = -10;计算机会直接把-10存入内存中吗?答案是不是
原因在于计算机只认识二进制。
因而就需要进制转换,需要把-10这一个十进制数字转换成为二进制的形式,这就牵扯到了原码、反码以及补码的概念和转换问题。

1.转换补码

在这里插入图片描述

有符号数:
首先,对于有符号数,一定要能表示该数据是正数还是负数,所以我们一般用最高比特位来充当符号位。
原码反码补码都有符号位和数值位。符号位0表示正数,1表示负数,而三种表示方法各不相同。
无符号数:
不需要转换,原码反码补码相同不存在符号位。


如果一个数据是负整数,那么要遵守下面的规则进行转换:
在这里插入图片描述
原码:直接将数字按照正负数的形式翻译成二进制即可
反码:符号位不变,数值位按位取反
补码:反码+1
无符号数:不需要转换(原码反码补码相同),没有符号位的概念
整形:数据存放内存中的其实是补码


为啥需要补码来存储整形类型?
原因在于:
1.使用补码,可以将符号位和数值位进行统一处理,并且加法和减法也可以统一进行处理
2.原码与补码的相互转换,其运算过程是相同的(都是取反+1),不需要格外的硬件电路

我需要强调一点的是,右边数字的二进制转换与左边的类型没有半毛钱关系,编译器判断有无符号整形,只看你赋值的数字有没有+号或者-号而已

那同学觉得计算机就这样把补码扔到内存了吗?
显然不只如此!还需要考虑大小端存储问题。

2.大小端存储

大小端存储取决于硬件单元,这个大小端存储是啥意思呢?
大小端存储的概念:
大端:低权值数字放到高地址处,高权重数字放到低地址处。
小端:低权值数字放到低地址处,高权值数字放到高地址处。

在这里插入图片描述

3.截断

考虑到怎么存储之后,我们还得需要考虑一个问题,就是会不会发生截断?比如你把一个数字放到一个char类型里面,char类型只有8个比特位,存不下一个数字的32个比特位,必然要发生截断
在这里插入图片描述

当然对于截断问题,只是顺便一提,有兴趣可以单独去研究一下。

4.取值范围的问题

一个类型有取值范围,那你知道取值范围是怎么进行确定的吗?
一个类型的取值范围的大小取决于这个类型有多少个比特位

假如我只给你一个比特位,请问你可以表示几个数字(不考虑符号位)?
就俩数字(2^1)嘛,一个0一个1嘛
我如果给你两个比特位呢?
4(2^2)个数字,00,01,10,11
我如果给你三个比特位呢?
8(2^3)个数字,000,001,010,011,100,101,110,111
……
所以,,,一个8个比特位的char类型,可以表示几个数字?2^8==256!
这也就解释char(有符号)类型的取值范围是-128—127了。
但是我有个小疑惑,-128靠8个比特位是怎么表示出来的?明明需要9个比特位啊。
在这里插入图片描述
只是人为规定!!!
之后呢,还要给大家看一个取值循环图,大家就能明白类型的取值范围是怎么回事了:
在这里插入图片描述
在这里插入图片描述

三、数据取出

1.大小端

还是要先看大小端问题,小端存储就小端取出,大端存储就大端取出即可。

2.自身类型

到了这个时候,说实在的左边的类型才有作用,什么意思呢?左边的类型决定了怎么看待这串二进制数字。
比如说左边如果是无符号整形类型,那么就不会把二进制最高位看成符号位,同理,如果是有符号类型,就会把最高位的二进制位看成符号位,这两种情况是截然不同的数值!
在这里插入图片描述

3.整型提升

如果我在内存里面是一个8个比特位的字符呢?你放入的类型却是一个int类型怎么办?整型提升。有符号int补符号位,无符号int前面补0,给你补到32个比特位再说。当然,这个地方也就不细说了,有兴趣可以自行研究一下。

练习题

最后送大家一道练习题哈,如果看完本文章大体理解我说的啥的话,应该可以做对,当然不对的话也不要担心哈,再弄懂就好啦,知识不是一下就会弄懂的。

int main()
{char a[1000];int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;}printf("%d", strlen(a)); return 0;
}

答案:255,请试分析本题。
解析:略。

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

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

相关文章

C++初阶类与对象(二):详解构造函数和析构函数

上次为类与对象开了一个头&#xff1a;C初阶类与对象&#xff08;一&#xff09;&#xff1a;学习类与对象、访问限定符、封装、this指针 今天就来更进一步 文章目录 1.类的6个默认成员函数2.构造函数2.1引入和概念2.2构造函数特性2.2.1特性1~42.2.2注意2.2.3特性5~72.2.4注意 …

3d模型线框怎么渲染不出来---模大狮模型网

如果您无法渲染出3D模型的线框&#xff0c;可能是由于以下原因&#xff1a; 未设置线框渲染选项在一些3D建模软件中&#xff0c;默认情况下可能不会渲染线框。要渲染线框&#xff0c;请确保已设置正确的渲染选项。通常&#xff0c;在软件的材质编辑器或渲染设置中可以找到相关选…

【探索C++容器:vector的使用和模拟实现】

【本节目标】 1.vector的介绍及使用 2.vector深度剖析及模拟实现 1.vector的介绍及使用 1.1 vector的介绍 vertor文档介绍 1. vector是表示可变大小数组的序列容器。2. 就像数组一样&#xff0c;vector也采用连续存储空间来存储元素。也就是意味着可以采用下标对vector的元…

C++ 之LeetCode刷题记录(十四)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 88. 合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &…

精确掌控并发:滑动时间窗口算法在分布式环境下并发流量控制的设计与实现

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;15&#xff09;篇&#xff0c;也是流量控制系列的第&#xff08;2&#xff09;篇。点击上方关注&#xff0c;深入了解支付系统的方方面面。 上一篇介绍了固定时间窗口算法在支付渠道限流的应用以及使用redis…

云轴科技ZStack 助力广西某地级市建设市级警务云视频系统

某市属于广西壮族自治区辖地级市&#xff0c;省域副中心城市&#xff0c;选择云轴科技ZStack 超融合解决方案支撑警务云视频监控联网管理系统&#xff08;警务云视频系统&#xff09;&#xff0c;实现了该市对各辖区视频资源统一管理&#xff1b;同时也满足了该市警务云视频系统…

Three.js 学习笔记之模型(学习中1.18更新)

文章目录 模型 几何体 材质模型点模型Points - 用于显示点线模型Line | LineLoop | LineSegments网格模型mesh - 三角形 几何体BufferGeometry缓冲类型几何体BufferGeometry - 基类创建几何体的方式BufferAttribute Types定义顶点法线 geometry.attributes.normal BufferGeom…

表的增删改查 进阶(二)

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;MySql&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 3.新增 4.查询 聚合查询 聚合函数 GROUP BY子句 HA…

【MySQL进阶】索引

索引机制 索引介绍 MySQL 官方对索引的定义为&#xff1a;索引&#xff08;index&#xff09;是帮助 MySQL 高效获取数据的一种数据结构&#xff0c;**本质是排好序的快速查找数据结构。**在表数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这…

无版权免费用!二次元爆萌AI壁纸

一、什么是AI壁纸&#xff1f; AI壁纸&#xff0c;顾名思义&#xff0c;是由人工智能精心设计的壁纸。它们不仅具有高度的审美价值&#xff0c;还能根据你的喜好和需求进行个性化定制。可爱风的AI壁纸&#xff0c;更是融合了萌系元素&#xff0c;让你的数字世界充满温馨与活力…

数据库经典面试题

习题一 1.1 创建表 ①创建Student表 mysql> create table Student ( -> Sno int primary key, -> Sname varchar(255), -> Ssex varchar(10), -> Sdept varchar(50) -> ); Query OK, 0 rows affected (0.01 sec) ②创建Course表 mysql…

【算法】使用优先级队列(堆)解决算法题(TopK等)(C++)

文章目录 1. 前言2. 算法题1046.最后一块石头的重量703.数据流中的第K大元素 2.5 如何选择大根堆 与 小根堆&#xff1f; 为什么选择大根堆&#xff08;小根堆&#xff09;&#xff1f;692.前K个高频单词295.数据流的中位数 1. 前言 我们知道&#xff1a;优先级队列是一种常用…