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

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

相关文章:

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

追求本质&#xff0c;不断进步 本文由睡觉待开机原创&#xff0c;转载请注明出处。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言&#xff0c;共同进步&#xff01; 这里写目录标题 一、空间的申请1.变量定义1.1变量定义的概念&#xff1a;1.2变…...

鸿蒙开发系列教程(五)--ArkTS语言:组件开发

1、基础组件 组件API文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/84_u58f0_u660e_u5f0f_u5f00_u53d1_u8303_u5f0f_uff09-0000001427744776-V2 查看组件API 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 容…...

Java:正则表达式讲解加举例,简洁易懂

正则表达式定义&#xff1a; 由一些特定的字符组成&#xff0c;代表的是一个规则。 作用&#xff1a;1.校验数据是否合法。2.可以在一段文本中查找满足要求的内容。 先自己写一个方法去校验qq号&#xff0c;比较与正则表达式的区别&#xff1a; 正则表达式的代码暂时可以不…...

2.机器学习-K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解

2️⃣机器学习-K最近邻&#xff08;k-Nearest Neighbor&#xff0c;KNN&#xff09;分类算法原理讲解 个人简介一算法概述二算法思想2.1 KNN的优缺点 三实例演示3.1电影分类3.2使用KNN算法预测 鸢(yuan)尾花 的种类3.3 预测年收入是否大于50K美元 个人简介 &#x1f3d8;️&…...

​WordPress顶部管理工具栏怎么添加一二级自定义菜单?

默认情况下&#xff0c;WordPress前端和后台页面顶部都有一个“管理工具栏”&#xff0c;左侧一般就是站点名称、评论、新建&#xff0c;右侧就是您好&#xff0c;用户名称和头像。那么我们是否可以在这个管理工具栏中添加一些一二级自定义菜单呢&#xff1f; 其实&#xff0c…...

Linux安装ossutil工具且在Jenkins中执行shell脚本下载文件

测试中遇到想通过Jenkins下载OSS桶上的文件&#xff0c;要先在linux上安装ossutil工具&#xff0c;记录安装过程如下&#xff1a; 一、下载安装ossutil&#xff0c;使用命令 1.下载&#xff1a;wget https://gosspublic.alicdn.com/ossutil/1.7.13/ossutil64 2.一定要赋权限…...

Docker命令---搜索镜像

介绍 使用docker命令搜索镜像。 命令 docker search 镜像命令:版本号示例 以搜索ElasticSearch镜像为例 docker search ElasticSearch...

docker使用http_proxy配置代理

钢铁知识库&#xff0c;一个学习python爬虫、数据分析的知识库。人生苦短&#xff0c;快用python。 在内网服务器中&#xff0c;docker经常需要下载拉取镜像&#xff0c;但由于没有网络要么只能手动导入镜像包&#xff0c;又或者通过http_proxy代理到其它服务器下载。 解决方法…...

综述:自动驾驶中的 4D 毫米波雷达

论文链接&#xff1a;《4D Millimeter-Wave Radar in Autonomous Driving: A Survey》 摘要 4D 毫米波 (mmWave) 雷达能够测量目标的距离、方位角、仰角和速度&#xff0c;引起了自动驾驶领域的极大兴趣。这归因于其在极端环境下的稳健性以及出色的速度和高度测量能力。 然而…...

蓝桥杯:1.特殊日期(Java)

题目描述 对于一个日期&#xff0c;我们可以计算出年份的各个数位上的数字之和&#xff0c;也可以分别计算月和日的各位数字之和。 请问从1900年1月1日至9999年12月31日&#xff0c;总共有多少天&#xff0c;年份的数位数字之和等于月的数位数字之和加日的数位数字之和。 例如&…...

服务异步通讯之 SpringAMQP【微服务】

文章目录 一、初识 MQ1. 同步通讯2. 异步通讯3. MQ 常见框架 二、RabbitMQ 入门1. 概述和安装2. 常见消息模型3. 基础模型练习 三、SpringAMQP1. 简单队列模型2. 工作队列模型3. 发布订阅模型3.1 Fanout Exchange3.2 Direct Exchange3.3 Topic Exchange 一、初识 MQ 1. 同步通…...

LED闪烁

这段代码是用于STM32F10x系列微控制器的程序&#xff0c;主要目的是初始化GPIOA的Pin 0并使其按照特定的模式进行闪烁。下面是对这段代码的逐行解释&#xff1a; #include "stm32f10x.h"&#xff1a;这一行包含了STM32F10x系列微控制器的设备头文件。这个头文件包含…...

php array_diff 比较两个数组bug避坑 深入了解

今天实用array_diff出现的异常问题&#xff0c;预想的结果应该是返回 "integral_initiate">"0"&#xff0c;实际没有 先看测试代码&#xff1a; $a ["user_name">"测","see_num">0,"integral_initiate&quo…...

c++中STL的vector简单实现

文章目录 vector构造函数 vector()拷贝构造 vector()析构函数 ~vector()iterator 的定义begin()与const版本end()与const版本增删改查尾插push_back()尾删pop_back()指定位置插入insert()指定位置删除 erase() operator[]与const版本容量增容reserve()设置容量 resize() 成员函…...

C# 更改Bitmap图像色彩模式

方法一&#xff1a;直接修改RGB的值 首先将BitmapData扫描线上的所有像素复制到字节数组中&#xff0c;然后遍历数组并对每个像素的RGB值进行修改&#xff0c;最后将修改后的像素值复制回BitmapData。这个过程不会影响原始的Bitmap对象&#xff0c;但会改变锁定的位图区域的数…...

5.2 基于深度学习和先验状态的实时指纹室内定位

文献来源 Nabati M, Ghorashi S A. A real-time fingerprint-based indoor positioning using deep learning and preceding states[J]. Expert Systems with Applications, 2023, 213: 118889.&#xff08;5.2_基于指纹的实时室内定位&#xff0c;使用深度学习和前一状态&…...

AIGC时代高效阅读论文实操

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

对网站进行打点(不要有主动扫描行为)

什么是打点&#xff1f; 简单来说就是获取一个演习方服务器的控制权限。 目的&#xff1a; 1. 上传一个一句话木马 2. 挖到命令执行 3. 挖到反序列化漏洞 4. 钓鱼 假设对“千峰”网站进行打点&#xff1a; 1. 利用平台 1. 利用各类平台&#xff1a; 天眼查-商业查询平…...

502. IPO(贪心算法+优先队列/堆)

整体思想&#xff1a;在满足可用资金的情况下&#xff0c;选择其中利润最大的业务&#xff0c;直到选到k个业务为止&#xff0c;注意k可能比n大。 每次选择完一个业务&#xff0c;可用资金都会变动&#xff0c;这是可选择的业务也会变化&#xff0c;因此每次将可选择的业务放在…...

设计模式篇---中介者模式

文章目录 概念结构实例总结 概念 中介者模式&#xff1a;用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。 就好比世界各个国家之间可能会产生冲突&#xff0c;但是当产…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...

Linux-进程间的通信

1、IPC&#xff1a; Inter Process Communication&#xff08;进程间通信&#xff09;&#xff1a; 由于每个进程在操作系统中有独立的地址空间&#xff0c;它们不能像线程那样直接访问彼此的内存&#xff0c;所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析

LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...

华为云Flexus+DeepSeek征文 | MaaS平台避坑指南:DeepSeek商用服务开通与成本控制

作者简介 我是摘星&#xff0c;一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型&#xff0c;将实际使用经验分享给大家&#xff0c;希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 作者简介 前言 一、技术架构概览 1.1 整体架构设…...