C++快速入门

C++快速入门
LZJFR-EDENCREATER-📣 文档更新日期:2025 / 6 / 17
📄 NSPD官方教程,引用自:\ _POST⛔ 未经允许禁止转载
⚠️ 建设中,不代表最终呈现效果
✅ 课程简介:
《 Rapid Learn of C++ 》是NSPD的第一个系列课程文档,针对于刚接触C++不久或者没有学习过C++的同学建设,顾名思义,这仅仅是C++学习中比较微不足道的一个入门级部分。C++的学习难度和成本一直都居于前列,所以,如果您是刚学习编程或者对计算机程序构建没有充分了解的小白,C++的学习肯定会伴随着快乐与疑惑不解。本课程专门为了改善这一高门槛编程语言的学习难度,我们会采用理论与实践结合的方式,每一章从一个小程序开始,用本章所学所讲来逐步提升这一小程序的整体功能,寓教于乐,综合提升。
✅ 本课程主要会包括而不限于下列基础内容:
- C++是什么
- 环境配置与调试
- C++基本数据类型
- C++的输入输出功能
- 操作数和运算符
- 流跳转
- 程序控制分支
- C++中级数据类型
- 基本函数功能
……
编者:LZJFR-EDENCREATER-
插图:LZJFR-EDENCREATER-
CHAPTER 1 | C++是什么
▶️ 在本章您将会了解到:
C++的前世今身
C++学习之路该怎么走?
说到C++大家应该不陌生,它拥有一套极其丰富并且繁琐复杂的知识体系。可为什么叫做 “C++” 而不是 “C” 或者其他的名字呢,我们认识到,C++实则是由一种叫做C的编程语言进化而来,所以,您如果学习了C++,C语言的内容您就大致掌握了,此乃一举两得之事,不过编者想告诉您,这两种语言虽是同门出生,但在两种语言的性质和编程思维上却天差地别。
我们想要了解C++,不如我们先来了解一下C。
C语言是一门高级编程语言,有多高级呢?其实没多高级😅,所谓的 “高级” 是指的相对于C语言之前的众多编程语言要更加简洁高效、功能丰富、语法完善,并且还有一套自己的“库”,也就是给程序员提供的一种便携工具包,这里面包含了加减乘除、输出输入、随机数字等众多高级功能,用户可以将这些原本需要成百上千行的代码操作对应到一句小小的话里,更或者一个符号里,是不是听起来很诱人?那么我们再来了解一下那些早期编程语言的发挥吧:
汇编语言,就是一种复杂且原始的编程语言,以下是一段汇编语言:
1 | DATA SEGMENT |
您知道这一段极其复杂的代码实现的是什么操作吗?这仅仅是想实现从1开始,一直加到100的总求和。读者也许会感觉到,满篇的数字字母交相辉映,令人眼花缭乱。这其实也是有原因的,更早期的语言只采用01代码来进行功能的实现。也就意味着人很难去读懂这一类只有两个数字交替出现的代码,除非您是一位高级分析师,否则您看一会儿就看晕了。
后来出现了汇编语言,所谓“汇编”,就类似于上文所述的“库”,它将一套很复杂的二进制代码浓缩到一个单词上,而用户仅需打出这个单词就能调用这个单词背后的一整座代码山所对应的操作,就像图中1️⃣处那两行开头的MOV操作符一样(本文不讨论低级编程,所以不解释这啥意思)极大地简化了操作。例如将两个数相加,可能用01代码就需要上百行,但汇编语言将这一操作浓缩到一个ADD操作符上,用户仅仅通过使用这一个单词就可以实现加法操作,是不是很简单?
可这并不是最简单的方案,汇编语言依赖于内存处理与指针编程,您可以想象一下,我为了将一个数字从一块内存上转移到另一块内存上,需要反复地调用内存寄存器(也就是将一个数零时存放的地方),因为在汇编语言的体系里,操作一个数,例如将它乘以10,就需要先将它转移到一块特定的内存上,再进行操作。别见怪,这恰恰符合了计算机内存的基本原则,才能有条不紊的进行这些操作;否则,在遇到大量的乘法运算时,如果不把这些数字集中到一块内存上,很容易发生意想不到的错误。为了简化一系列的内存转移操作,新一代(第三代)编程语言诞生了,就像C、C++这样的“高级”编程语言。
如果说将01代码转换为一个操作符是实现了浓缩代换,那么将一系列经过代换的操作符集合成一个全新的单词就更加高级了。有人说那这样无限代换会不会产生一定的混乱感?例如:从1加到100如果代换为一个单词,比如one_to_hundred,那么按照这个逻辑,实现这样一个操作就只需要输入该单词即可。但,这真的有必要吗?如果这样,我要从1加到500是否就需要一个one_to_500呢?从1加到1000呢?这样效率太过低下,我会为了实现这一系列的操作而设定一系列的 “代换单词” ,以至于到最后我也不明白那个单词对应哪种操作,人们会为了寻求简便而开发出成千上万的这样的单词,每次写代码第一想到的是操作对应的单词是什么,而不是到底应该实现怎样的逻辑才能看到我想要的效果,这违背了代码的自定义化,局限了大部分的操作体系,就像八股文一样,极力追寻简便往往会适得其反。
每个人写作文都有自己的风格,有的人严肃,有的人诙谐。但无论怎样,他们为了表达同一个观点而写文章,这所表现出来的影响一定是相同的。类似地,高级编程语言一定是像写文章一样,只要语法正确逻辑正确怎样写都没问题。用户想实现一个加法操作也可以按照自己的想法写了,不用在那里乱转寄存器。用户可以像写一段话一样写一行代码,再将你写的代码拿去编译。编译,一种高级操作,通俗来讲也就是将外语翻译一遍变成本地语言的文章,类似于 “本地化” ,你写的程序就像这里的外语,编译就像翻译一样,将你所熟悉的语言转化为计算机所熟悉的语言,例如汇编语言等相对低级的语言。这样,你写出来的代码和之前的汇编代码所产生的效果就一模一样了。
从上面的一段话可以看出来,想要实现高级编程语言的创造,就必须要具备:
- 编译器,也就相当于翻译员,把你的高级语言降级到低级语言。
- 语法检测器,也就是相当于英语阅卷老师一样的语法检查官,如果你写了一段错误的代码,甚至可能是对计算机有害的代码,语法检测器将阻止编译器编译,更高级的,还会指出你的错误,记住,它只能检测语法错误,不能检测逻辑错误,不要指望它为你检测出代码逻辑上的错误,就像法官只按法律审判,而不管人情世故。
C语言完美的兼容了以上所有特性,它拥有GCC编译器,用来转换程序;也有一系列的语法检测算法来检测语法错误。
那C++又更高级在哪里呢?拥有相同的工具,又是同源出生,唯一不同之处便是他们的编程宗旨和内部算法的升级,例如,C语言中的输入输出是靠两个函数(后面再介绍,你就理解成一种高级版的浓缩单词吧)进行的,而C++是靠模板类( 一种高度自定义的操作集合体,本文档不讨论C++的OOP编程 )进行输入输出的,并且还新增了流缓存区这一功能,让输入输出更加简便安全。
这样看,C++确实是比C要更加高级方便,C++还广泛用于游戏、家电、汽车、服务器等多种领域,读者如果没有很强的体会也无关系,后面的教程将增强两者的差异。您只需要知道C++的来历和优越性。
接下来看看C++的开发者:
C++是一种计算机高级程序设计语言,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。
C++还在持续发展与更新,从1979年到您在阅读这句话的那个瞬间,C++的标准制定者们无时无刻不在开发C++的新功能,并舍弃C++的一些旧功能,您需要认识到的是,C++的不同版本会有一些细微的差异,这是很正常的。文档主要使用最新版的C++,您需要兼容一部分的功能才能与文档一致。
尾声
从汇编语言到C++,经过了几代人的不懈付出。如今您的计算机、手机、甚至是冰箱处处都有C++的影子,可见,C++的普及性一定超过了 本贾尼·斯特劳斯特卢普 的预期。但是,站主想告诉您,信息技术始终是发展并且交融的新世纪科学,这难免会有迭代与消亡。C++并不意味着高级,因为C#已经出现了;汇编不意味着低级,因为它在丧失通用特性的同时大大增加了代码的自定义化。学习C++,不能只是学习它的基本知识,更要了解它的历史与基本特性,并用其他编程语言的知识来更加充分的了解C++,这样,您收获的,将是远远超出C++本身的东西。
CHAPTER 2 |C++编程的环境配置与调试
▶️ 在本章您将会了解到:
C++编程环境的配置
C++编程环境的调试
C++编程的原理
2.1 C++编程环境的配置
首先,一位优秀的程序创作者应该知道,他要开发的项目一定要对应一种编程语言,例如游戏创作可以选择C#(Unity)、C++(cocos-2d);网页设计可以用HTML、css、Java等。那么如果他选择使用C++来进行一系列的开发,就必须要有对应的开发工具,就像制作雕塑需要刻刀、画素描画需要H、HB、B数种型号的铅笔……C++也是如此,如果我要写一段C++的代码,从本质上来说,代码就相当于一段人能看懂的话,C++环境在这里的作用就是将这段话编译(一种人机翻译,在第一章讲过)出来,交给计算机去处理你说的这段话,最后达到您想实现的效果。
在第一章,我们提到过一种GCC编译器,它的作用这里不再概述,不过编者想告诉您的是,GCC是一种针对于C语言的编译环境工具,我们强调C++是一种与C形式相近,而截然不同的高级语言,所以,对于C++的编译,我们会用到G++编译器。这是专门适用于C++的编译器,从百度谷歌等平台可以搜索并下载这一工具。
延续上一章,既然在源代码与成品文件之间存在一种编译关系,也就是说,编译工具将您写的代码转换为机器码并生成出一类叫做可执行文件(例如.exe文件、.bat文件)的成品文件来对应您想实现的功能,从而实现了用户可以通过成品文件来直接使用您开发的软件而非将您的源代码下载下来手动编译一遍。这种做法的好处在于,可以有效避免用户将您的代码进行传播侵权,违法修改,还可以让用户仅仅双击一下鼠标就可以使用。总而言之,编译器将您的代码进行编译并加密。下面是一幅编译流程图:
在C++中,源文件的扩展名为:.cpp,所以,您只需要新建一个空白文档,取一个好听的名字(最好只包含数字字母)将后缀从txt改为cpp,无视风险,就可以创建一个最简单的、没有任何内容的源文件了,当然,它的本质还是一个文档文件,没有任何功能和内容,就算进行编译也会失败,后面我们将教您如何编译它。
现在市面上的编程环境主要分为 集成开发环境 和 非集成开发环境,前者较为简单,只需要下载一款软件或者执行一段Shell脚本即可使用,例如Visual Studio、Dev Cpp等,您可以自行从官网下载,这里不多概述。
非集成开发环境指的是分散性的一系列工具组成的环境,在使用时往往缺少一键生成、一键编译等功能,相对繁琐,需要用户使用命令行工具进行手动编译,并且无法直观查错、分析,只有等待编译时的报错信息才能确定程序问题,这里也不多概述。
还有一种是半集成型环境,即嵌入式集成开发环境(IDE),指的是将非集成开发环境嵌入集成开发工具 中,类似于将环境嵌入模板中,这块模板可以接纳很多诸如此类的非集成环境,使用难度低于非集成开发,高于集成开发,我们着重讲这一类环境的配置:
以开发软件 VS Code 为例,一步步来带领您配置环境。
首先,请在官网下载VS Code 。而后,安装C++插件。如果您不习惯英文,还可以安装汉语插件包,重启应用即可。
安装 C++ 扩展: 打开 VS Code,按下 Ctrl+Shift+X 打开扩展视图。 搜索 C++,找到 C/C++ 扩展并点击安装。
安装好插件以后,需要继续安装 MinGW-W64( Minimalist GNU for Windows x64),一款开源编译环境,免费无污染。可以从Github下载(需要加速器),也可以直接从Github仓库克隆到本地。后者请学习《Github基础教程》或者有一定了解后再使用,有上手门槛。
安装 MinGW-W64: 前往 MinGW-W64 GitHub 页面下载最新版本的安装程序,下载是…x86_64…exe的即可。 双击运行安装程序,按照提示完成安装,安装在C盘最好,且用户名不要是中文,否则经常会遇到无法解决或意想不到的问题,安装完成后勾选立即运行会弹出终端窗口,请不要退出,以供继续下一步安装。
安装完成弹出终端以后,输入下面的命令行以继续:
1 pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain安装过程中会询问是否继续和安装多少包体,输入回车或”y”即可继续,安装完成后,关闭界面,进入下载到的文件夹中,进入
...\msys64\ucrt64\bin文件夹,复制该文件夹的路径。在Windows系统的搜索框中输入
编辑系统环境变量,打开编辑系统环境变量的设置界面,在下方找到环境变量一项,点击打开界面,选中并双击 Path变量 。进入Path后,点击右侧的新建,输入刚才复制的地址(需要绝对地址),确认并关闭,最后在主界面点击确认完成环境变量的配置。
为确认环境的配置成功,打开命令提示符(cmd),输入如下命令:
1
2
3 gcc --version
g++ --version
gdb --version如果出现相关信息,则表示安装成功。
安装完成后,即可以进入VS code进行编程与学习,本教材不包含软件使用教程,请自行查阅资料上手您要选择的编程软件进行学习。
本教学文档进行的是通用教学,即无视各种软件带来的特性差异,如果您在某个时刻发现自己看到的现象与本文档的记述不相符合,极有可能是您的电脑配置差异与使用的软件差异造成的。
2.2 C++编程环境的调试与文件编译原理
一个完整的C++编译过程总共包含以下四个过程:
- 编译预处理(预编译或者叫预处理)阶段,使用命令
g++ -E - 编译阶段,使用命令
g++ -S - 汇编阶段,使用命令
g++ -c - 链接阶段
打开您在上一小节选择的编程软件,新建一个.cpp文件并命好名称(最好只包含字母与数字),如果您使用的是Visual Studio一类的项目或解决方案类型的IDE,可以选择“控制台应用”一项创建。创建好之后,复制如下代码到cpp文件中:
1 |
|
复制好后,保存并退出。
虽然现代集成开发软件自带一键调试编译的功能,您依然需要知道如何手动操作这一过程,以应对后面的学习。
2.2.1 预编译
C++是一种高级编程语言,需要再次强调的是,它虽然从C语言中来,但依然拥有与其相兼容的功能,预编译就是其中之一。
C++源代码需要经历几个步骤才能到达最后的成品文件,第一个步骤就是预编译。预编译是指将源代码文件中的某些文字转化成具有同等作用效果的文字(类似于扩句,让句子更详细完整有风度,只不过是把这一行为给电脑看而已),这一步旨在让一些语句所表达的意义更具体、更符合计算机的底层逻辑(没理解到也没关系,后续将深入讨论该点);或者将文件中的一些特殊标记提取出来,以备后面步骤的识别等。总之,预编译就是将源代码转换得更加清晰、完整。当然,预编译的作用很重要,如果没有这一步骤,后面的步骤将很难进行。
打开键入如下命令:
g++ -E [name].cpp -o [name].i,其中 [name] 表示您的文件名。
这里举一个例子来说明预处理源文件时编译主体干了什么:
1 | 这是未编译的.cpp源文件: |
1 | 这是在预处理阶段的.i文件: |
对比来说,预处理后的文件将原有的宏定义内容、库文件、头文件内容及定义(即上文的#include 与 #define sizE 1000)替换为等价性语句。比如前者替换为了iostream文件中的全部内容(足足有30000余行),后者将文档里出现的所有“sizE”替换为了10000,也就是为什么后面一个文件中是 “ cout << 1000 << endl; ” 而不是: “ cout << sizE << endl; ” 了。
除此之外,预处理编译还将去除注释(例如这里的 //this is a comment 一行),至于注释、头文件、库文件、宏定义是什么,这里便不做解释,在后续的学习中将会陆续遇见他们,您只需要知道它们都是为了让代码更加浅显与易于编辑而诞生的。为什么会去除注释而不对程序本身产生影响?因为注释本身就没有任何的实际意义,仅仅只是程序员给自己写下的一段提示语。
总结来说,这个阶段编译器做了如下操作:
去除注释
将宏定义内容替换为实义内容
替换头文件的代码段为头文件本身所链接的文本
这个阶段的意义前面已经叙述了,概括来说,就是将一些不够简洁的话变得更简洁,将太简单的和不具备一定意义的等效语句替换为有实义的语句,这将为后面的步骤提供巨大的便利,同时也搭建起了程序与程序编写者的桥梁,使得有人类语言风格的语言能够被计算机理解和运用。
2.2.2 编译
编译阶段在预编译阶段的基础上将源文件翻译为更加贴近计算机语言的文件。众所周知,现代计算机主要利用二进制与汇编语言进行系统架构,意思是,如果我们想给计算机投喂一项功能程序,就必须让这个程序也具备和系统架构类似的特征,比如让计算机理解一个汇编程序比理解一个更高级语言的程序更容易,在生物学中,具备膜性质的物质与细胞膜的融合度更高,在这里同样适用。
本步骤也是四个编译步骤中唯一一个具备查错功能的步骤,如果您的程序出现了语法错误或神秘错误,在经过此步骤时会直接被拦截,不能进行下一步操作。
使用gcc或g++编译会使上一步的产物(.i文件)转化为中间产物 .s文件 ,即汇编指令集,以备下一步使用。
打开键入如下命令:
g++ -S [name].i -o [name].s,其中 [name] 表示您的文件名,注意是将 .i 转化为 .s !
由于本教程是c++教程,故不在此讨论上一步文件是如何转化为汇编语言的。
2.2.3 汇编与链接
汇编阶段在上一阶段的基础上将汇编指令集组织成二进制语言,做到了与计算机的完全协调沟通,计算机将可以直接理解程序,但二进制变成极为复杂,这里不做汇编阶段的详细介绍,但您需要知道这一步的命令:
打开键入如下命令:
g++ -c [name].s -o [name].o,其中 [name] 表示您的文件名。
汇编后的文件不能直接运行,是因为二进制文件还没有与库内容相结合,在第一章我们已经讲过,库的实现是c++相较于低级语言的一大进步体现,库是一种集成式调用源,支配着整个以c++为架构的程序体系,相当于它提供了一系列的便捷服务,可以直接拿来使用。上一阶段完成后,二进制文件中的大部分内容仅仅是平平无奇的文字,而不是具有操作与执行价值的命令或指令,要想将一段文字转化为有实际意义的程序就需要将其中的部分文字提取出来,与库中的同名内容进行匹配与调用,以实现库中预设的功能,发挥出c++最大的优势。
打开键入如下命令:
g++ [name].o -o [name],其中 [name] 表示您的文件名。
上面所示的命令就是链接阶段的命令,即将二进制文件转化为可执行程序(.exe),以供用户使用,到此,程序编译的四个步骤的内容就介绍完毕,编译的根本目的是为了让程序通过”编译作用”转化为机器能够理解的可执行产物,编译的步骤是层层递进的。
总结来说,编译分为以下命令:
g++ -E [name].cpp -o [name].ig++ -S [name].i -o [name].sg++ -c [name].s -o [name].og++ [name].o -o [name]
当然,编译其实不用一步步地输入指令、等待编译进行,可以实现跳步,可以从第一步直接跳到第四步,您只需要输入:g++ [name].cpp -o [name],即可一步完成编译。这里所说的跳步是指您不用一步一步输入,而不是说计算机没有执行这些操作。
同时需要强调的是,c++的编译进程只能正向进行,不可以逆向,即不可以从第一步跳到最后一步又回到第一步。在前文我们讲过,有些步骤在执行时会去除程序中的部分语句,替换掉多数语句,此操作不可逆的原因之一就在于删掉的东西会彻底消失,没人会知道这个程序曾经是什么样,所以这就保证了c++的可执行文件具有保密性,除了程序制造者没有人能够窥探它的源代码。
有趣的是,自上世纪开始,市面上涌现了一批先进的逆向分析软件。他们负责将可执行文件或其他不能够逆向编译找回源代码的文件进行分析渗透,使用大量算法与推测(例如递归下降算法),最后生产出一份与其源代码相似的代码文件或分析结果,至于原来文件中的被删除的内容,很可能与经过分析得出的文件中的部分内容相似。这就实现了间接篡改程序的功能,也造就一大批破解程序或软件。当然,这种逆向有利有弊,他们也同样运用于分析漏洞等网络安全领域,成为了本世纪的一大重点课题与先进技术,为人工智能领域提供了无法埋没的贡献。
本章回顾
c++程序源文件的编辑、编译需要在编译环境下进行,例如 Vs code 等嵌入式集成开发环境中。
开发环境分为:集成、非集成、嵌入式。
编译分为4个阶段,阶段环环相扣,将人类风格语言转换为计算机风格语言,以实现人机对话。
编译只能正向,不可以逆向。
逆向分析技术是一种新型技术。
章节练习 | 难度:⭐
下载一款你喜欢的编译器或配置一款你喜欢的编译环境,试着熟悉它的操作,了解它的主要功能和发明背景。
编译一段简单的代码并执行对应的可执行文件。
CHAPTER 3 |C++基本数据类型
▶️ 在本章您将会了解到:
基本数据类型
变量与常量
数据与位存储模式
调用与声明
变量与常量数据的命名
3.1 C++ 的基本数据类型
首先,我们来了解一下数据类型是什么。
数据类型(Type)是指一类用来封装数据的形式载体,通俗点来讲,就像给一堆数字进行分类。有些数字表示年龄,例如:69岁、91岁、114岁;有些表示身高,例如191cm、160cm、200cm等等,我们根据用途对所有的数字进行分类,虽然他们表达的含义是不同的,但他们都是整数,所以他们是相同的数据类型。但如果是同一意义的不同类型数字呢?小学数学我们学过整数、小数、自然数、分数,这些都可以看作是不同的数据类型,191cm可以看作:191.0cm、191.000cm、1.91 x 102cm……它们都表示这样一个形容身高的数字。在计算机中,也存在着这样各式各类的数字,计算机系统会根据不同的数据类型进行不同的操作,例如整数会强制使其包含的数据舍去小数点,以多位二进制存储在磁盘中。
根据需求的不同,存储相应数据的数据类型也会不同,例如计算机要将两个整数相乘,根据数学原理,所得值必然是一个整数,所以操作数完全没有必要增加小数点于后方。但如果是几个小数相乘,那么极有可能产生一个拥有小数点后多位数字的值,这时,整数已不能满足需求,需要用更高精度且专门针对小数而生的新类型。
可见,数据类型是依据人为而专门制定的,数据类型的存在使数据可以突破以含义为界限的分类方式,进而以需求和表示形式进行分类。这种方式的优点在于,计算机可以分区对不同的数据类型进行存储与处理,更加高效便捷。毕竟,数字表示方式的数量远少于世界上所有含义的数量。
在C++中,我们将普通整数(包含正负数、0)统称为int32_t(integer_32byte),也就是占据磁盘空间32位的整型数据类型,通常写作:int,这也成为了广大编程语言中最热门的类型。
由于他只能占据磁盘空间中的4字节,即32位,所以存储的数字值的大小也有限,大约在-2147483648 到2147483647之间(含端点),这个两个极值的绝对值之和为4294967295,这是因为在普通计算机中,32位二进制最大能表示的数就是这么多,即32位的每一位都是1,又因为整数包括正负数与0,于是平摊下来,正数比负数的绝对值小一,因为0只算做一次。下面是计算详解:
整数只能存储不带小数点的数据,如果带,则一律不按四舍五入舍去小数点后的一切数位。
除了32位整型,还有16位、64位、128位整数类型,分别为short、long (即long int)、long long (即long long int)。其中long类型根据操作系统与中央处理器的不同而导致自身大小的不同,有时是64位,有时是128位。当然,位数越大,所能表示的最大数就越大,下面是一张表格,普及了常见整型的范围:
| 类型 | 典型字节大小 | 典型范围 | 简介与用途 |
|---|---|---|---|
| short | 2 | -32768 ~ 32767 | 节省内存的较小整数(像素值) |
| long | 4或8 | 同 long long 或 同 int | 较大整数,兼容性差,不常使用 |
| long long | 8 | -9223372036854775808 ~ 9223372036854775807 | 极大的整数(大数计算、时间戳) |
那么既然有可以表示正负数的整型,有没有不能表示负数的整型呢?有,只需要在上述四种基本整型之前加一个”unsigned”即可,意为“无符号的”,顾名思义,只能表示无符号整数,即正数与0。这种类型的优点是进一步扩大了最大表示值,使得最大正数扩大到自身的两倍,而且可以在不需要处理负数时节约空间,其中 unsigned int类型等同于unsigned类型,两者皆可用。
为了增强程序的兼容性,让程序能够在不同的平台和计算机上稳定运行,C++11更新了几种定宽整型(int_xt / uint_xt):int8_t、int16_t、int32_t、int64_t、uint8_t、uint16_t、uint32_t、uint64_t。前四个类型为有符号定宽整型,后四个类型为无符号定宽整型。定宽整型与普通整型是等同的,例如int8_t等同于short,uint64_t等同于unsigned long long。区别在于这类数据类型的兼容性与移植性更强,他们的名称也更加一致整齐。
当然,随着C++标准的逐渐更新完善,出现了部分特殊的整型,这里举出几个例子:
| 类型 | 字节大小 | 用途 |
|---|---|---|
| size_t | 同 unsigned long long | 表示类或函数等对象的返回值大小 |
| ptrdiff_t | 4 或 8(依据计算机) | 数组索引中的指针差值计算 |
| intptr_t / uintptr_t | 4 或 8(依据计算机) | 整型与指针类型的互相转化 |
这里提供了一项怎样确定该使用哪种整型的建议:
真不知道该用什么就用最常见的int类型。
要节省内存就用short或int8_t类型。
大数计算或存储大数就用long long或int64_t。
要使用非负数就用unsigned或unsigned系列的类型。
要移植或做到多设备兼容就用(u)intx_t系列的类型。
总之,整型是基本数据类型中较为灵活的一种类型,可深入研究。当然,在后面几章中,我们还会讲到与整型有关的其他知识。

