【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,请试分析本题。
解析:略。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cuda二进制文件中到底有些什么

大家好。今天我们来讨论一下&#xff0c;相比gcc编译器编译的二进制elf文件&#xff0c;包含有 cuda kernel 的源文件编译出来的 elf 文件有什么不同呢&#xff1f; 之前研究过一点 tvm。从 BYOC 的框架中可以得知&#xff0c;前端将模型 partition 成 host 和 accel(accel 表…

日期处理第四篇(终)- Java日期时间处理大总结

文章目录 日期时间概念通用标准日期字段解析国际化的日期格式 日期的实战第一个问题&#xff1a;日期常用时间操作第二个问题&#xff1a;时区的问题时区概念时区的处理ZoneID的使用 ZoneOffset的使用让人恼火的夏令时 第三个问题&#xff1a;MySQL存储时间用什么类型&#xff…

HCIA——23DNS层次域名空间、域名服务器、域名解析的原理的选择、解答

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

【笔记】Blender4.0建模入门-3物体的基本操作

Blender入门 ——邵发 3.1 物体的移动 演示&#xff1a; 1、选中一个物体 2、选中移动工具 3、移动 - 沿坐标轴移动 - 在坐标平面内移动 - 自由移动&#xff08;不好控制&#xff09; 选中物体&#xff1a;右上的大纲窗口&#xff0c;点击物体名称&#xff0c;物体的轮…

LabVIEW电火花线切割放电点位置

介绍了一个电火花线切割放电点位置分布评价系统&#xff0c;特别是在系统组成、硬件选择和LabVIEW软件应用方面。 本系统由两个主要部分组成&#xff1a;硬件和软件。硬件部分包括电流传感器、高速数据采集卡、开关电源、电阻和导线。软件部分则由LabVIEW编程环境构成&#xf…

2024如何入局云计算?亚麻云助力您成为云专家!一次不过,免费再考

福利派送 2024年伊始&#xff0c;一波又一波的裁员潮又开始啦&#xff01;还在做传统行业&#xff1f;还在做传统程序员&#xff1f;亦或是对未来依旧迷茫&#xff1f;赶紧趁着行业东风&#xff0c;开始了解入门云计算吧&#xff01;亚马逊云科技&#xff0c;认证福利免费送&a…

C++——结构体

1&#xff0c;结构体基本概念 结构体属于用户自定义的数据类型&#xff0c;允许用户存储不同的数据类型。像int&#xff08;整型&#xff09;&#xff0c;浮点型&#xff0c;bool型&#xff0c;字符串型等都是属于系统内置的数据类型。而今天要学习的结构体则是属于我们自定义…

Java前端——HTTP协议中get和post的区别

get 和 post是 HTTP 请求的两种方法 应用场景&#xff1a; 一般 get 请求用于对服务器资源不会产生影响的场景&#xff0c;如请求一个网页的资源 post 请求一般用于对服务器资源会产生影响的情景&#xff0c;如注册用户这一类的操作。 get请求一般用于向服务器请求数据&…

Elastic Stack 8.12:通过对 ES|QL 等的改进增强了向量搜索

作者&#xff1a;来自 Elastic Tyler Perkins, Shani Sagiv, Gilad Gal, Ninoslav Miskovic Elastic Stack 8.12 构建于 Apache Lucene 9.9&#xff08;有史以来最快的 Lucene 版本&#xff09;之上&#xff0c;基于我们对标量量化和搜索并发性的贡献&#xff0c;为文本、向量和…

Bert详解

Bert框架 基本架构Embeddingpre-trainingMLM&#xff08;Mask Language Model&#xff09;NSP&#xff08;Next Sentence Prediction&#xff09; fine-tuning优缺点 基本架构 由Transformer的Encoder层堆叠而来 每个部分组成如下&#xff1a; Embedding Embedding由三种E…

最小生成树(Java实现)

一、Prim算法 Prim算法基本思想为&#xff1a;从联通网络 N{V,E}中某一顶点 v0 出发&#xff0c;此后就从一个顶点在 S 集中&#xff0c; 另一个顶点不在 S 集中的所有顶点中选择出权值最小的边&#xff0c;把对应顶点加入到 S 集 中&#xff0c; 直到所有的顶点都加入到 S 集中…

D-Tale SSRF漏洞复现(CVE-2024-21642)

0x01 产品简介 D-tale 是一个在 2020 年 2 月推出的库, 是 Pandas 数据结构的可视化工具。它具有许多功能,对于探索性数据分析非常方便、支持交互式绘图、3d 绘图、热图、特征之间的相关性、构建自定义列等等。 0x02 漏洞概述 D-Tale 是 Pandas 数据结构的可视化工具。3.9…

swift基础语法

swift学习笔记 参考教程 https://www.runoob.com/swift/swift-data-types.html swift代码规范 https://juejin.cn/post/7129465308376465422 1 环境搭建 必须要有苹果电脑且安装Xcode 2 基本语法 Swift是类型安全的语言&#xff0c;编译时会进行类型检查 import Cocoa var m…

Git学习笔记(第7章):IDEA实现Git操作(VSCode)

目录 7.1 配置忽略文件 7.2 初始化本地库 7.3 添加暂存区、提交本地库 7.4 修改文件 补充&#xff1a;工具栏简介 7.1 配置忽略文件 问题引入 在版本控制系统中&#xff0c;有些文件或目录是不需要纳入版本管理的&#xff0c;比如编译产生的临时文件、日志文件、缓存文件等…

基于springboot+vue的网上购物商城(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

hugo的常规使用操作

hugo的常规使用操作&#xff08;不断完善中&#xff09; 找到theme主题中config.toml 一般都会通过theme中复制到自己项目的config.toml中做修改和补充&#xff0c;来完善不同的业务需求 Hugo静态资源载入逻辑 原理 将图片信息放到static中&#xff0c;但是在文章中写的时…

电脑存储位置不够怎么办

电脑内存不够怎么办&#xff01;&#xff01;&#xff01; 我前段时间经常因为电脑D盘内存不够而苦恼&#xff08;毕竟电脑内存就那么丁点&#xff0c;C盘作为系统盘不能随便下东西的情况下&#xff0c;就只能选择其他盘进 方法一&#xff1a;检查电脑硬盘的分区情况&#xf…

Unity下实现跨平台的RTMP推流|轻量级RTSP服务|RTMP播放|RTSP播放低延迟解决方案

2018年&#xff0c;我们开始在原生RTSP|RTMP直播播放器的基础上&#xff0c;对接了Unity环境下的低延迟播放&#xff0c;毫秒级延迟&#xff0c;发布后&#xff0c;就得到了业内一致的认可。然后我们覆盖了Windows、Android、iOS、Linux的RTMP推送、轻量级RTSP服务和RTSP|RTMP播…

《WebKit 技术内幕》学习之五(3): HTML解释器和DOM 模型

3 DOM的事件机制 基于 WebKit 的浏览器事件处理过程&#xff1a;首先检测事件发生处的元素有无监听者&#xff0c;如果网页的相关节点注册了事件的监听者则浏览器会将事件派发给 WebKit 内核来处理。另外浏览器可能也需要处理这样的事件&#xff08;浏览器对于有些事件必须响应…

BGP Local-preferenct 、AS-Path、 Origin 综合选路实验

Local-preference&#xff1a; 本地优先级&#xff0c;公认任意&#xff0c;仅能在 AS 内使用&#xff08;IBGP内传递&#xff09;&#xff0c;不能在EBGP传递&#xff0c;默认值 100&#xff0c;越大越优。用于离开本 AS &#xff0c;在 IBGP 的入、出方向都可使用&#xff0c…