C++ 炼气期之数据是主角

1. 前言

数据在程序中的重要性怎么强调都不为过。程序的本质是通过提供数据处理逻辑将数据从一种状态变为另一种状态。一种过程状态。处理逻辑必须有针对性,针对数据本身的特性。

只有了解数据本身的内在逻辑意义和数据之间的逻辑关系,才能提供正确的处理逻辑。例如,根据面粉的特性,适合做面包、面条的加工逻辑,不适合辣条的制作逻辑。

数据是程序的主角,逻辑是程序的脚本。本文将从以下几个方面来谈谈C++中数据的主角。

2.数据存储

在谈论数据存储之前,我们需要知道什么是数据?

数据是计算机世界对现实世界信息的映射,映射数据的过程也是计算机对现实世界的认知过程。

制图还有一个专门的概念:数字建模。

认知过程包括:

数据存储包括静态存储和动态存储。本文只讲解动态存储,即程序运行时数据是如何存储的。程序运行所需的数据存储在变量中。

什么是变量?

变量是位于内存中的存储块。该存储块再次由一个或多个基本存储单元组成。基本存储单元的大小通常为 1 字节 (1 B)。

位是计算机中最小的存储单位。这个单位太小了,引入字节单位,1字节等于8位(1B=8bit)。

因为内存块中的数据可以根据逻辑的需要随时变化,所以变量一词来源于此。

变量的含义强调存储块中数据的动态性和灵活性。

什么是变量名?

为了方便访问变量,开发者需要给变量起一个名字,也就是变量名。

当C++运行时系统根据开发者的请求指令打开存储空间时,会将变量名与变量关联起来。这样就可以通过变量名的唯一变量标识在程序中访问变量中的数据了。

开发者提供的变量名,也称为变量的逻辑名。 C++底层机制会建立一个映射表来存储变量名与对应存储块的映射关系。

变量名由开发者指定,由系统关联。开发者在命名变量时,需要遵循变量命名的语法规则。

变量名命名规则:

变量名命名规则:

如果规则是法律约束,那么规则就是道德约束。规则遵循语法标准,不容忽视,规范遵循事实标准。所谓事实上的标准,是指行业内的继承或约定。可以忽略,但是会破坏代码的可读性和格式一致性。

当需要存储数据时,需要向C++运行时系统申请变量。这里会有一个常识。申请时需要告知变量的实际大小。就像你做衣服的时候,你对老板说,给我做一件衣服。这种信息是不够的。你必须告诉老板衣服的尺码,这样老板才能明智地使用面料。

那么,在申请变量的时候,如何告诉底层机制你需要的变量的大小呢?

答案是通过数据类型。

//在C++ 中需要变量时,一定要指定数据类型
数据类型 变量名;

数据类型在声明变量语法中有两个函数:

数据类型的具体概念是什么?以及为什么指定数据类型可以让底层运行机制知道开发者需要的变量大小,下面会详细介绍。

3.数据类型

什么是数据类型?

所谓数据类型,就是计算机世界对现实世界中信息的分类。

为什么要对数据进行分类?

分类是数据识别的过程,分类的过程也是了解各种数据特征的过程。只有了解数据的特点,才能制定出有效的解决方案。

自动驾驶汽车系统最复杂的部分是汽车在行驶过程中需要实时对周围的数据进行分类,无论是石头还是人还是花还是小狗还是小猫。 .. 只有当类别明确时,才能给出相应的解决方案。是人,停下来,是能开过去的花草,是石头,要分清它的大小。

计算机对现实世界中的信息分类越精细,其处理领域和处理能力就越强。如果人类只知道化学元素周期表中1/3的元素,人类的科技文明将远远低于目前的科技成就。

化学周期表中的元素是有限的,但元素之间的关系可以用来创建复合材料。这个非常重要。在C++语言系统中,还可以根据基本的分类构造更复杂的类型,比如结构体、类、枚举……

C++ 将现实世界的信息分为两个基本类别:

p>

3.1 个数值数据

数值数据分为整数数据和浮点数据。整数数据一般理解为不带小数点的数字,浮点数据可以理解为带小数点的数字。

2.1.1 个整数数据

C++用int来统称整型数据,以int为边界来划分:

当存储不同类型的数据时,C++会根据类型分配相应的存储空间,导致所描述的数字大小不同。

所以!上述各种数据类型所描述的数字范围是多少?

C++与其他高级语言不同,比如JAVA,它严格规定int为4字节大小。但在C++标准中,对int只有一个抽象的规定,它所描述的数字范围的大小与机器字相同。

机器字是计算机的计算单元在单位时间内可以处理的数据位数。就像我们常说的16位处理器,32位处理器。

16 位处理器每单位时间可以处理 16 位或 2 个字节的数据。

32 个处理器每单位时间可以处理 32 位或 4 字节的数据。

所以,当同一个程序在不同的计算机平台上运行时,int所能描述的数据范围是不同的。假设本程序运行在32位电脑上,请在编写以下变量声明和赋值代码时注意细节。

//十进制
int num_1=34;
//八进制,前面使用 0 作为前缀
int num02=023;
//十六进制,前面使用 0X 作为前缀
int num03=0x12;

short int num_a=23;

下面是不正确的赋值操作,因为常量已经超出了short int描述的数字范围。

short int num_a=100000;

long int num_3=45;

最好在数字后加一个 L 或 l 后缀。经测试,在写这篇文章的时候测试代码的电脑上long int和int所描述的数字范围是一样的,都是4B。

long int num_3=10000000000L;

long long int num_3=10000000000LL;

由于int类型大小的不确定性,C++程序在跨平台使用时可能会被移植。问题。

什么是移植问题?

这里一定有问题。我在 32 位计算机上写程序时,用 int 来描述一个 32 位数据。如果让这个程序在 16 位计算机上运行,​​它会编译失败或丢失数据。

类似于我在银行存东西的时候,银行给了我4个储物柜来存放我的东西,我也装满了4个储物柜。

当我转移到另一家银行时,他们说他们最多只能给我2个储物柜,这绝对不能存放我的所有物品,并且会导致数据丢失。

如果情况反转也没关系。

问题出现了,必须解决。一种解决方案是在程序级别解决它。写程序的时候,在程序运行的时候拿到电脑。机器字根据计算机的机器字存储在不同的数据类型中。

在程序逻辑中,需要随时获取底层硬件的工作状态,这与高级语言的概念相矛盾,增加了开发者的负担,而且容易忽略的地方,这会导致移植时错误遍布整个程序。

当然,C++也可以让开发者使用int来统一描述数据。在编译器中,编译器会根据计算机的机器字采用是否拆分存储的方案。也就是把上面的逻辑从开发层移到了编译层。

这是常规方案,但会增加编译器的工作量,影响编译速度。

另一种解决方案,C++ 提供类型关键字,在句法级别明确描述数字的范围,开发人员可以自行选择。这样在语法层面和编译层面就有了统一的协议,编译器不需要做条件判断。

已签名和未签名的问题:

默认情况下,int 是有符号的,这意味着它可以存储正数和负数。以下2行代码语义相同。

signed int num_1=34;
int num_2=34;

如果需要表示无符号整数数据类型,则需要使用关键字。使用该关键字后,负数不能存储在变量中。以下代码在语法上是正确的,但是从变量 num_1 中获取不到数据 -34,而是垃圾数据。

	unsigned int num_1=-34;

C++ 语言有一个令人兴奋的地方。

下面的代码,很明显,98788已经远远超出了int描述的范围,没有语法提示,可以正确编译运行,但是从变量num_3得到的数据是垃圾数据。

int num_3=1000000000098;

C++的语法更宽松,编译器更“流畅”。

可以说是劣势,但也是优势。正是因为没有加固才能编译得更快。

无符号数据 您可以在数据中添加 u 或 U 作为无符号数据的标识符。

unsigned int num_3=34u;

有符号整数和无符号整数不代表相同的数字范围。在32系统中, int类型范围如下图,即0~。

unsigned int num_1=4294967295;
unsigned int num_2=num_1+1;
cout<<num_1<<endl;
cout<<num_2<<endl;
return 0;
//输出结果
4294967295
0

int类型默认是有符号的,只是省略了。在 32 位平台上, int 的范围是 -~。

在有符号的描述中,最高位不代表有效数据位,而是一个标志位:

2.1.2 浮点数据

浮点数据是指带小数点的数据。 C++ 使用 float 和 来表示浮点数据类型。

什么是重要位?

显着是指数据中有意义的位数。

默认情况下,文字浮点常量是数据类型。下面的 34.0 是类型。

double num=34.0;

从数学的角度来看,34.0后面的0是没有意义的,但是C++还是把它当作浮点数来处理的。

为浮点常量添加 f 或 F 后缀。表示为浮点数据类型。

float num=34.5f;

浮点常量后加L后缀,为长数据类型。

long double num=34.5L;

当浮点常量以 f、F、l 或 L 为后缀时,它们只能以十进制开放形式使用。 C++ 在描述浮点数据时也可以使用科学记数法。科学记数法指数具有指数表示。

以下代码代表3*102

double num=3e2;

这里2称为指数,3称为尾数。

以下代码表示3.4*10-2

double num=3e-2;

在计算机的底层,存储的是整数数据,浮点数据是不同的。整型数据可以直接存储,而浮点型数据分为两部分分别存储。

例如保存3.457十进制时,可分为以下两部分保存:

读取数据时,将值按比例因子减小,可以得到3.457。缩放或放大系数的作用是移动小数点的位置。上面是一个小数的例子来说明这个问题。事实是计算机底层是二进制存储的,缩放因子是2的幂。

因为小数点可以移动,所以这种类型的数据称为浮点型。

但是你知道,原理是一样的,事实上浮点数据的底层存储结构要比整数存储结构复杂得多。

3.2 种非数字类型

C++ 非数值类型有 char 和 bool。

3.2.1 个字符类型

char用于表示单个字符或小整数,char常量需要用单引号括起来。

char myChar='A';

计算机可以直接存储数字数据,只需将数字转换成二进制即可。计算机不能直接存储字符,所以需要按照统一的标准将字符转换为数字后再存储。这个过程称为字符编码。

ASCII 编码标准最早被计算机使用,主要用于对英文中使用的字符进行编码。因为英文字符不多,所以1B的存储空间就足够了。 C++对char类型的原始存储标准是1个字节的存储空间。

但对于其他国家的语言来说,还远远不够。 char默认不能存储汉字,因为中文至少需要2个字节的存储空间。

中文编码标准包括、GBK,这两个标准只能编码汉字。

还有一个国际统一的标准,用于对世界上所有语言的字符进行统一编码。

下面的代码看似可以存储,但实际上存储的是垃圾数据。如前所述,C++并没有在语法层面检查数据是否合理。编译器采用的原则是能存就存,不能存就存能存的部分。

char myChar='中';

C++还有一种字符数据类型,称为宽字符类型,其存储大小为2字节。

wchar_t myChar='中';

另外,C++11标准中有和类型描述,主要支持编码标准,都是无符号类型。从字面上看,你可以知道一个支持16位存储,另一个支持32位存储。

无符号字符

char 默认情况下既不是无符号也不是有符号,因为没有编码的负 ASCII 字符。有扩展空间。

C++有一个无符号字符类型(char),它的值不仅包括ASCII码表上的所有字符,还包括扩展ASCII码表上的一个字符。扩展字符是不能通过键盘输入的字符。但是你可以通过字符和整数的关系来初始化或者赋值一个无符号字符变量。

unsigned char myChar=128;

char和 char表示的范围不同:

3.2.@ >2 bool 类型

bool 类型用于表示真假。在 C++ 中,非零值可以被视为真。零值被视为假。

bool exist=true;
bool exist_=1;
	
bool exist01=false;
bool exist01_=0;

4. 数据采集

程序中数据的来源有多种方式:已知数据、交互数据、数据库中的数据、网络中的数据、文件中的数据……

已知数据是指程序中直接出现的字面量数据,也称为常量数据,可以直接参与运算。分配。

交互数据,也称为输入数据。程序运行时,通过交互机制获取用户输入的数据。

int num=0;
cout<>num;
cout<<"你刚输入的数字是"<<num<<endl;

C++通过cin和重定向指令完成交互数据的获取。

如果要获取数据库中的数据,需要依赖数据库驱动的API。如果要获取文件中的数据,需要使用文件读写API,如果需要网络上的数据,则需要网络相关的API`。这超出了本文的主题,有兴趣的可以查阅相关文档。

5.总结

本文试图从数据的存储、数据的类型、数据的来源等方面来解释数据的本质。程序的脚本要启动,数据的主角要先到位。你对数据的了解程度决定了逻辑的高明。

虽然这篇文章的内容很基础,但是特别重要。基础设施的坚固与否决定了高层建筑的高度。

© 版权声明
THE END
喜欢就支持一下吧
点赞222赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容