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

C进阶 数据的存储

目录

前言

一,VS的知识储备

二,有趣的scanf()读取

三,数据的存储 引言

四,整数存储

五,小数存储

总结


前言

这里将深入计算机,看计算机是如何进行数据的存储的,怎么在计算机里面筑巢
为什么会有debug和release两个玩意,太可恶了有时候bebug不行,release可以有时候又反之,知识人性的考研还是计算机的腐败
神奇的scanf在我编写程序与我摩擦出了怎么样的火花
大小端又是一个什么东西,究竟会为什么会改变我对存储的认知


一,VS的知识储备

1,debug和release的区别
两者的主要区别是在于编译的方式,优化等级,预处理器宏定义和运行时库
 debug模式主要运用于调试,适合在开发阶段
release模式主要用于优化代码,提高执行效率,适用发布阶段

1,编译方式
debug模式下编译器会生成的可执行文件中包含调试信息
release模式下编译器会开启多种优化选项,以提高程序的执行效率

2,优化等级
bebug模式会关掉各种优化选项,以便调试程序
release模式会开启各种优化选项,以提高程序的执行效率

3,预处理器的宏定义
debug模式下通常会定义一些预处理器,以便调试程序,而release则不需要
 常用的预处理器宏
 为了区分这两种模式,通常会定义一些预处理器宏。例如:

  • Debug 模式 下,可能会定义 _DEBUGDEBUG

  • Release 模式 下,这些宏通常不会被定义

4,运行时库不一样
debug模式下运行时,库通常是多线程调试版本,而release为多线程,非调试版本,这是也为了减少可执行文件的大小,提高效率

  1. Debug 模式(调试模式)

    • 运行时库:通常是多线程调试版本(如 /MTd/MDd)。这些库包含了调试信息和额外的错误检测机制,例如内存分配检查、缓冲区溢出检测等

    • 特点

      • 包含调试符号信息,便于调试工具加载和使用

      • 生成的可执行文件体积较大,运行速度较慢,但能提供丰富的调试支持

      • 通常会生成 .pdb 文件,用于存储调试信息

  2. Release 模式(发布模式)

    • 运行时库:通常是多线程非调试版本(如 /MT/MD)。这些库不包含调试信息,专注于性能优化

    • 特点

      • 不包含调试符号信息,减少了可执行文件的体积

      • 优化了代码执行效率,提升了程序的运行速度

      • 更适合最终用户使用,因为其体积小、运行速度快

2,X86和X64
X86是32位的X86架构,此架构使用大多数旧的32位windows操作系统和处理器,如果你的应用程序在此平台运行,要选着这个X86架构
X64是64位的X64架构,此架构适用支持64位操作系统于处理器的计算机,X64无法在32位操作系统运型,但是可以又更大空间进行操作

  • 32位和64位架构的区别

    • 地址空间:64位架构支持更大的地址空间

    • 寄存器数量和宽度:64位架构有更多的寄存器,寄存器宽度更大

    • 指令集:64位架构支持更复杂的指令集

    • 性能和效率:64位架构通常更适合高性能计算和大数据处理

    • 栈空间:64位系统可以支持更大的栈空间,但默认的栈大小并不一定比32位系统大

二,有趣的scanf()读取

我在使用scanf的时候遇到了这个问题

我想正常的输入一个带有空格的字符串,但是最后打印出来只有一个I,我的LOVE YOU没有了,是因为scanf扫描到I后面的空格的时候就忽略了后面的LOVE YOU


scanf() 在读取字符串得时遇到空白字符串(空格,制表符和换行符)时会停止读取,并将剩下的字符(包括换行字符)留在stdin输入流里面(不是键盘缓冲区)

#include <stdio.h>                                                                
#include <windows.h>                                                             
int main(void){                                                                   char str[80], str1[80], str2[80];                                           scanf("%s",str);/*此处输入:I love you!*/                                    printf("%s\n",str);                                                          Sleep(5000);/*这里等待5秒,告诉你程序运行到什么地方*/                       scanf("%s",str1);/*这两句无需你再输入,是对stdin流再扫描*/                  scanf("%s",str2);/*这两句无需你再输入,是对stdin流再扫描*/                  printf("%s\n",str1);                                                         printf("%s\n",str2);                                                         return 0;                                                                     
}     

由此可知残留的信息是保存在stdin输入流里面,而不是缓冲区里面 

三,数据的存储 引言

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>int main() {int i = 0;int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };for (int i = 0;i < 12;i++) {arr[i] = 0;printf("hehe\n");return 0;}return 0;
}

我们这个代码其实是一个错误的代码,有数组溢出的风险,但是我们分别debug和release去运行
debug的

release反而相反

存储
C99(1999年推出的C语言第三代)里面有long long为8个字节
类型
long为4个字节或者8个字节>=int(在X86平台下为4字节,在X64平台下为4字节)
short为2字节
类型的意义:1,开辟内存空间的大小     2,看待内存空间的大小

整形家族
字符型本质就是ASCII码,所以划分到整形

char有三种类型,char!=signed char(不一定)这个取决于编译器,可能是signed char或者unsigned char
int有两种类型,int=signed int

signed和unsigned的意义
在现实生活中,如果没有负数(如:身高,体重,…),有负数(温度,体温…)
有符号的正数范围会减小,无符号的正数的分为会变大

其他类型
自定义类型:数组,枚举,联合体,结构体
指针类型:空类型void*
void作为形参的时候,只是起说明作用

四,整数存储

进制的快速判断为多少的技巧

我看这个图不难的出里面其中的规律,每往前面前进对应的数字的次方都是+1,然后最后利用数字与这些数字相乘即可 

进制的三种类型

三种类型:1,原码     2,补码     3,反码
正数:三种类型都是相同的
负数:反码:除符号位不变,其余的按位取反
           补码:在反码的基础上加上1
内存其实存储的是二进制,但是在显示器上面显示的为16进制,并且存储的为二进制的补码
为什么要用补码而不是原码呢?
我们以1-1为例子

根据上面这个图,应该很快就可以理解了

大小端

int a = 20
0x 11 22 33 44
int b = -10
0x 55 66 77 88

大端:高位放高端            小端:地位放高端
总:大端正常,小端反常
很多编译器都是以小端的形式存储的
 

五,小数存储


1E10为1.0*10^10

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>int main() {int n = 9;float* pfloat = (float*)&n;printf("%d\n", n);printf("%f\n", *pfloat);*pfloat = 9.0;printf("%d\n", n);printf("%f\n", *pfloat);
}

当你看到这个答案,肯定会以为是9,9.000000,9,9.000000
当然答案并不是这个
 答案是这个,为什么呢?接下来,小数的存储会给你答案

浮点数的存储规则:
根据IEEE规定,任意一个二进制浮点数V可以表示下面的形式
V=(-1)^s*M*2^E
(-1)^s为符号位     s=0为正数,s=1为正数
M为有效数字 >=1     <2
2^E表示指数

这里有两个例子,首先二进制表示这个浮点数,小数点的左边跟正数一模一样,小数点的右边也跟正数差不多,只不过为负的次方

为什么有的数字不精确,这就可以得出答案了,因为后面就是2^-1,2^-2……这样没办法对于一些数字的精确

计算机是对于ME有相关规定的

根据IEEE规定,在计算机内部保存M的时候,默认这个M为1的,如果只有一个M的话可以省掉不屑,如保存1.01的时候,可以写成.01
目的:提高精度,舍掉1存1,则从23位数跳到了24位数

E
unsigned int类型
但E也有可能为-1
0.5---0.1---1.0*2^-1---(-1)^0*1.0*2^-1
由于出现了-1,这个规则就需要完善
则就出现了中间值这个概念(以0.5为例子)
(浮点类型为1023,整形类型为127)
float---E(真实值)+127(中间值)---126---存储
double---E(真实值)+1023(中间值)---1022---存储

例子
5.5---(-1)^0*1.011*2^2
E1=E+127=129---存储

浮点数的拿出
E不全为0或者不全为1时
E-127,同时M前面加1,5.5为例子
 这个就是在011前面加1.,然后后面这个次方2就是减去127即可

E全为0,直接为1-127或者1-1023就是真实值,表示无穷小
E全为1,这里M的有效数字为0,表示无穷大
E0.000……表示+-0无限接近0的数字


总结

1,debug和release
一个是运用到代码开发,一个运用到发布
debug是用于改进代码,会爆出相应的错误,但是包含的库文件就会更加庞大
release是用于优化代码,会自动优化代码,包含的库文件文件会比较小,但是不会报错,不适用代码开发

2,scanf()
遇到空格等字符会进行停止扫面,剩下的部分在stdin流里面,而不是键盘输入流

3,整数的存储
整形的家族是包括char类型的,而且要知道无符号和有符号的意义
整形的存储有三个形式,原码,反码,补码
计算机存储的补码,原因是可以便于进行计算,计算之后直接就是答案了

4,浮点数的存储
(-1)^s*M*2^E
首先我们利用二进制,小数点左边就是整数一样的二进制形式,右边就是次方为相反数,这个就是小数不可以精确的原因了
M规则:可以把第一个1省略掉,这样就可以从23位到24位,扩大范围
S规则:由于位unsigned int类型,所以就有了中间值这个概念,float:127    double:1023
浮点数存储位第一位:s值,后8位:表示M,剩下的就是小数点后面的数字了,然后再后面补0就好了
 

相关文章:

C进阶 数据的存储

目录 前言 一&#xff0c;VS的知识储备 二&#xff0c;有趣的scanf()读取 三&#xff0c;数据的存储 引言 四&#xff0c;整数存储 五&#xff0c;小数存储 总结 前言 这里将深入计算机&#xff0c;看计算机是如何进行数据的存储的&#xff0c;怎么在计算机里面筑巢 为…...

第二十二章 P - R 开头的术语

文章目录 第二十二章 P - R 开头的术语程序员模式 (programmer mode)项目 (project)属性 (property)属性排序 (property collation)属性方法 (property method)公有 (public) 以 Q 开头的术语查询 (query)查询接口 (query interface) 以 R 开头的术语范围指示符 (range indicat…...

【C语言】第一期——数据类型变量常量

目录 1 字面量 2 整数类型 2.1 整数类型的取值范围 2.1.1 sizeof 运算符 2.2 GB、MB、KB、B之间的关系 2.3 定义整数类型的变量并打印 2.4 整数类型代码演示 3 浮点类型 3.1 浮点类型的取值范围 3.2 定义浮点类型变量并打印 3.3 保留2位小数点 4 char字符型 4.1…...

【c++】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗?

【c】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗&#xff1f; 1.线程终止会导致进程终止吗&#xff1f; 在操作系统中&#xff0c;线程是进程的基本执行单元&#xff0c;一个进程可以包含一个或多个线程。 当一个子线程终止时&#xff0c;进程并不会因此自动终…...

宝藏软件系列 篇一:My APK(Android)

文章目录 系列文章官方网站特色功能同类软件 系列文章 官方网站 My APK 官方版本是在 谷歌商店 中上架的。 官方下载地址&#xff1a;Google Play 商店页面。&#xff08;需要外网&#xff09; 2025.2最新版本的CSDN本地下载地址&#xff08;因为是Android App Bundle&…...

springcloud集成gateway

本篇文章只介绍gateway模块的搭建步骤&#xff0c;并无gateway详细介绍 gateway详解请查看&#xff1a;SpringCloudGateway官方文档详解 前置处理 父模块中已指定版本 不知道如何选择版本看这篇&#xff1a; 手把手教你梳理springcloud与springboot与springcloudalibaba的版本…...

pandas(13 Caveats Gotchas和SQL比较)

前面内容&#xff1a;pandas(12 IO工具和稀松数据) 目录 一、Caveats警告 & Gotchas预见 1.1 在Pandas中使用if/Truth语句 1.2 位运算布尔 1.3 isin操作 1.4 重新索引reindex和 loc&iloc 使用注意事项 1.5 loc和iloc 二、Python Pandas 与SQL的比较 2.1 数…...

Android的Activity生命周期知识点总结,详情

一. Activity生命周期 1.1 返回栈知识点 二. Activity状态 2.1 启动状态 2.2 运行状态 2.3 暂停状态 2.4 停止状态 2.5 销毁状态 三. Activity生存期 3.1 回调方法 3.2 生存期 四. 体验Activity的生命周期 五. Activity被回收办法 引言&#xff1a; 掌握Acti…...

基于Python的Flask微博话题舆情分析可视化系统

2024数据 ✅️标价源码 远程部署加 20 ✅️爬虫可用 有六月数据 ✅️修复bug不会突然打不开网页 系统稳定 系统的功能如下: 1.数据的爬取 2.用户的登录注册 3.热词统计&#xff0c;舆情统计 4.文章统计分析 5.发布地址统计 6.评论统计 7.情感分类统计 编程语言&#xff1a;py…...

【Python爬虫(1)】专栏开篇:夯实Python基础

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

【油漆面积——线段树,扫描线,不用pushdown的特例,pushup兼有cal的性质】

题目 分析 不用pushdown是因为&#xff1a; 对于modify&#xff0c;操作是互逆过程&#xff0c;因此不会存在向下结算的pushdown过程 对于query&#xff0c;操作始终针对最上层的tr[1]&#xff0c;也不需要pushdown 对于pushdown&#xff0c;一则是怕不结算就标记&#xff0c;会…...

fps武器系统6:随机弹道

文章目录 设计随即弹道 思路连射时在一个范围内随机改变枪口旋转即可 实现改变枪口旋转改变旋转就是改变物体朝向即可随机&#xff1a;锥体随机 疑问旋转体与物体朝向(向量)间的关系为什么随即弹道调用两次 设计 随即弹道 思路 连射时在一个范围内随机改变枪口旋转即可 实现…...

深度学习(1)-简单神经网络示例

我们来看一个神经网络的具体实例&#xff1a;使用Python的Keras库来学习手写数字分类。在这个例子中&#xff0c;我们要解决的问题是&#xff0c;将手写数字的灰度图像&#xff08;28像素28像素&#xff09;划分到10个类别中&#xff08;从0到9&#xff09;​。我们将使用MNIST…...

硬件学习笔记--42 电磁兼容试验-6 传导差模电流干扰试验介绍

目录 电磁兼容试验-传导差模电流试验 1.试验目的 2.试验方法 3.判定依据及意义 电磁兼容试验-传导差模电流干扰试验 驻留时间是在规定频率下影响量施加的持续时间。被试设备&#xff08;EUT&#xff09;在经受扫频频带的电磁影响量或电磁干扰的情况下&#xff0c;在每个步进…...

Shader示例 6: 卡渲基础 - 描边 + 着色

0 、获取原神模型&#xff1a; 【游戏开发实战】下载原神模型&#xff0c;PMX转FBX&#xff0c;导入到Unity中&#xff0c;卡通渲染&#xff0c;绑定人形动画&#xff08;附Demo工程&#xff09;-CSDN博客 《原神》公测视频征集计划 一、描边pass&#xff1a;Outline 1. …...

Cherno C++ P55 宏

这篇文章我们讲一下C当中的宏。其实接触过大型项目的朋友可能都被诡异的宏折磨过。 宏是在预处理当中&#xff0c;通过文本替换的方式来实现一些操作&#xff0c;这样可以不用反复的输入代码&#xff0c;帮助我们实现自动化。至于预处理的过程&#xff0c;其实就是文本编辑&am…...

(20)从strlen到strtok:解码C语言字符函数的“生存指南1”

❤个人主页&#xff1a;折枝寄北的博客 ❤专栏位置&#xff1a;简单入手C语言专栏 目录 前言1. 求字符串长度函数1.1 strlen 2. 长度不受限制的字符串函数2.1 strcpy2.2 strcat2.3 strcmp 3. 长度受限制的字符串函数3.1 strncpy3.2 strncat3.3 strncmp 4. 字符串查找函数4.1 st…...

基于deepseek api和openweather 天气API实现Function Calling技术讲解

以下是一个结合DeepSeek API和OpenWeather API的完整Function Calling示例&#xff0c;包含意图识别、API调用和结果整合&#xff1a; import requests import json import os# 配置API密钥&#xff08;从环境变量获取&#xff09; DEEPSEEK_API_KEY os.getenv("DEEPSEE…...

Mongodb数据管理

Mongodb数据管理 1.登录数据库&#xff0c;查看默认的库 [rootdb51~]# mongo> show databases; admin 0.000GB config 0.000GB local 0.000GB> use admin switched to db admin > show tables system.version > admin库&#xff1a;admin 是 MongoDB 的管理…...

从短片到长片:王琦携《Mountain》续作迈向新高度

在王琦(Qi Wang)的带领下,广受关注的短片《Mountain》迎来了成长篇续作《Rite of the Mountain》。这一全新长片不仅是她从短片迈向长篇叙事的重要一步,更是一次大胆的艺术挑战。作为制片人的她,将继续以敏锐的视觉风格和深刻的叙事洞察,拓展《Mountain》所触及的情感深度,并构…...

DeepSeek应用——与PyCharm的配套使用

目录 一、配置方法 二、使用方法 三、注意事项 1、插件市场无continue插件 2、无结果返回&#xff0c;且在本地模型报错 记录自己学习应用DeepSeek的过程&#xff0c;使用的是自己电脑本地部署的私有化蒸馏模型...... &#xff08;举一反三&#xff0c;这个不单单是可以用…...

c#中“事件-event”的经典示例与理解

在C#编程语言中&#xff0c;事件&#xff08;Event&#xff09;是一个非常重要的概念&#xff0c;它提供了一种松耦合的方式&#xff0c;让对象间能够通知彼此&#xff0c;而无需直接联系。事件的使用可以让我们的代码更加灵活、可扩展且易于维护。 事件可以视作委托的实例&…...

如何画产品功能图、结构图

功能图的类型 常见的功能图包括数据流图、用例图、活动图、状态图、类图、组件图、部署图等等&#xff0c;不同的应用场景和目标下&#xff0c;需要确定不同的功能图类型。 数据流图 用例图 状态图 类图 组件图 组件图是由软件系统、组件和组件之间的关系组成的图形&#xf…...

标准输入输出流,面向对象,构造函数

标准输入输出流 为什么不直接用printf和scanf? 不能输入/输出C新增的内容 std C的一些标识符&#xff0c;都是定义在std这个名字空间下面cout 是什么&#xff1f; 1.是一个ostream对象 output stream:输出流使用 <<&#xff1a;输出流运算符 作用&#xff1a;将右边…...

Vue2 中使用 UniApp 时,生命周期钩子函数总结

在 Vue2 中使用 UniApp 时&#xff0c;生命周期钩子函数是一个重要的概念。它允许开发者在特定的时间点运行代码&#xff0c;管理组件的生命周期。以下是 Vue2 中 UniApp 常用的生命周期钩子函数总结&#xff1a; 1. beforeCreate 说明: 组件实例刚被创建&#xff0c;此时数据…...

QEMU源码全解析 —— 内存虚拟化(12)

接前一篇文章:QEMU源码全解析 —— 内存虚拟化(11) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 QEMU内存管理模型...

如何将ubuntu下的一个目录,保存目录结构为一个git仓库并上传

目录 1. 初始化本地Git仓库 2. 添加文件到仓库 3. 提交更改 4. 创建并关联远程仓库 5. 推送代码到远程仓库 完整流程总结 要将Ubuntu下的一个目录&#xff08;例如rpc&#xff09;保存为一个Git仓库并上传到远程仓库&#xff0c;您可以遵循以下步骤&#xff1a; 1. 初始…...

深度学习中通道数的理解

目录 一、通道&#xff08;Channels&#xff09;的作用 1. 表示输入数据的多样性 2. 提取多层次特征 3. 信息融合与交互 4. 控制模型的复杂度 5. 支持多任务学习 6. 实际应用中的通道设计 7. 总结 二、案例一 1. 输入图像的通道&#xff08;RGB&#xff09; 2. 输出特…...

2025寒假天梯赛训练5

L1-3 敲笨钟 - 2025寒假天梯赛训练5 思路&#xff1a;一般ex的模拟题&#xff0c;主要是找好空格的位置进行修改替换。 #include <bits/stdc.h> using namespace std; #define int long long #define endl "\n" #define sz(x) (int)x.size() #define e empla…...

PowerBI 矩阵 列标题分组显示(两行列标题)

先看效果 数据表如下&#xff1a; 我们在powerbi里新建一个矩阵&#xff0c;然后如图加入字段&#xff1a; 我们就会得到这样的矩阵&#xff1a; 我们在“可视化”->“列”&#xff0c;上双击&#xff0c;输入空格&#xff0c;就能消除左上角的"类别"两字 同理修…...