专栏简介:为什么我要重新介绍c++的相关知识,在此之前,我对于c++的了解也仅仅是在表面。而在后来与c++慢慢的接触中,c++编程语言越来越让我觉得深奥,所以还是想要重新开创一个专栏来介绍c++。对于c++的介绍,本专栏会先介绍98版的c++知识,之后会介绍11版的c++知识。
日常分享:每天努力一点,不为别的,只是为了日后,能够多一些选择,选择舒心的日子,选择自己喜欢的人!
目录
一、基本内置类型
1.1、算术类型
1.1.1、带符号类型和无符号类型
1.2、类型转换
1.2.1、无符号类型表达式
1.3、字面值常量
1.3.1、整型和浮点型字面值
1.3.2、字符和字符串字面值
1.3.3、转义序列
1.3.4、指定字面值的类型
1.3.5、布尔字面值和指针字面值
一、基本内置类型
c++中的内置数据类型包括算术类型和空类型。其中算术类型包含了字符、整数、布尔和浮点数。
1.1、算术类型
算术类型分为两类,一类是整型,一类是浮点型。而无论是哪种类型。均有一个数值大小限制,而数据类型的大小是以字节来作为单位的。
类型 | 含义 | 最小尺寸 |
int | 整型 | 16位(最低来两字节) |
bool | 布尔类型 | 未定义 |
char | 字符 | 8位(1字节) |
wchar_t | 宽字符 | 16位 |
char16_t | unicode字符 | 16位 |
char32_t | unicode字符 | 32位 |
short | 短整型 | 16位 |
long | 长整型 | 32位 |
long long | 长整型 | 64位 |
float | 单精度浮点型 | 6位有效数字 |
double | 双精度浮点型 | 10位有效数字 |
long double | 扩展精度浮点型 | 10位有效数字 |
上面说的位指的是比特位,8个比特位为一个字节8个字节为一个字(通常情况)。由于计算机是通过二进制来进行存储的,所以说,对于不同数值大小的数据也要用不同的数据类型来定义,具体的大小参考上表。
1.1.1、带符号类型和无符号类型
除了布尔型和扩展的字符型外,其他整型可以划分为有符号类型(signed)和无符号类型(unsigned)。有符号类型表示的是所有整数,包括负数,0,正数。而无符号类型则只能表示大于等于0的正数。
在数据类型的前面添加unsigned就可以表示无符号类型,而对于字符型char,也被分为三种,char、signed char、unsigned char。注意类型char和signed char是不一样的,虽然说有三种类型,但是一般只认为有符号和无符号两种类型,类型char至于具体是那一种,要看编译器。
特别注意一下,unsigned所定义的数据类型,他的所有比特位均用来放置数值,也就是高位不会存在用于判别正数还是负数的符号位。比如8比特的unsigned char可以存放0~255之间的值,而8比特位的signed char存放的是-128~127之间的数值。
对于编程过程中,在选用数据类型的时候要个根据具体的变量需求来进行选择。但是有一些经验准则是可以用的:
🕐、在确定是否要选择无符号类型时,先要确定数值是否不可能为负。
🕑、进行整数运算的时候,尽量使用int类型,如果不够长就是用long long。
🕒、在进行算术运算时,不要使用char类型,不同的编译器对char的定义不同,可能会出现在这个机器上能跑,另一个机器上就不能跑的情况。
🍀、在选择浮点类型时,建议选择double类型,float类型的精度太低,而且在目前这种情况下,float和double消耗的资源差距不是特别大,而long double则不推荐使用,消耗的资源太大。
1.2、类型转换
类型转换说白了就是将原本定义的对象的数据类型转化成其他数据类型。关于类型转换这个问题,很多人都会遇到类型转换失败导致资源浪费,甚至出现数据泄漏问题。所以说关于数据类型转换这个问题对于新手还是存在很大的问题。很多人看书,书上会说int可以转为double,但是有时候double又不能转为int,如果只是去背诵转换准则,则显得比较困难。所以对于类型和转换,我给出我的编程经验。
类型转换准则:
🕐、内存小的数据类型可以转化为大内存的数据类型,比如4字节的int类型可以转换成double类型。而对于高内存的数据类型转换成小内存的时候,必须要判断数值大小是否超过了转换后数据类型的大小。
类型转换过程:
🕐、当我们把非布尔型转化成布尔型时,如果初始值为0,则为false,否则为true。
🕑、把布尔值赋值给非布尔的时候,初始值为true则结果位1,否则为0.
🕒、浮点数赋值给整数的时候,结果仅保留浮点数中的整数部分,小数点后面的数值直接摒弃。
🕔、当我们赋值给无符号类型一个超出他表示的范围后,结果是初始值对无符号类型表示的数值总数取模后的余数。
🕕、当我们赋值给有符号类型一个超过他本身表示范围的值时,结果是未定义的。很有可能导致程序崩溃,这就和上面我讲的大范围转小范围时要注意数值。
1.2.1、无符号类型表达式
在讲解无符号类型表达式之前,我们先来看一段代码:
#include<iostream>
int main()
{
unsigned u=10;
int i=-30;
std::cout<<i+i<<std::endl;
std::cout<<i+u<<std::endl;
return 0;
}
最后运行结果是:
-60
4294967276
为什么是这个答案喃?这是由于,在无符号表达式中,会将有符号数值变为无符号数值, 负数转化成无符号数值时,就是将该数值加上无符号数的模。就比如上面的例子,int占据4个字节,也就是32位,那么无符号数最大是2的32次方,也就是4294967296,加上-30,就是转化后的无符号数。
1.3、字面值常量
在c++中,形如10这种确切的值被称为字面值常量(litera),每一个字面值都会存在一种数据类型,换句话说,字面值的形式和值决定了它的数据类型。
1.3.1、整型和浮点型字面值
整型字面值的具体数据类型,是要看他的数值大小和符号决定。一般情况下,十进制字面值时有符号数,具体是int,long还是long long类型则要根据数值大小确定,从最小的类型开始。二进制和八进制则既有可能是有符号类型也有可能是无符号类型,具体的数据类型也是需要根据数值大小来确定,从最小的内存大小的数据类型开始。
浮点数字面值一般是double类型,前面讲过,double是双精度,更加准确。
1.3.2、字符和字符串字面值
由单引号括起来的单个字符称为char型字面值。双引号括起来的零个或多个字符构成的字符串型字面值。
char a='A'; //字符字面值
char a[10]="abcdef"; //字符串字面值
字符串字面值的类型实际上就是多个字符组成的数组,每个字符串的末尾都会有一个空字符('\0‘)。所以说字符串的长度总是比实际长度多1。
1.3.3、转义序列
在编程中,有两类字符不能直接使用:一类是由于无法显示的图符,比如退格符,和其他控制符。还有一类就是c++中的转义字符。
转义字符 | 含义 |
\n | 换行符 |
\t | 横向置表符 |
\v | 纵向制表符 |
\b | 退格符 |
\a | 响铃 |
\\ | 反斜线 |
\? | 问号 |
\r | 回车符 |
\f | 进纸符 |
\" | 双引号 |
\' | 单引号 |
除了转义字符,用一些数字也是可以的,比如:\7(响铃),\12(换行符)等等。
1.3.4、指定字面值的类型
添加前缀或者后缀,也可以改变整型、浮点型和字符型字面值的默认类型。
字符前缀(后缀) | 含义 |
L‘a’ | 宽字符型字面值,类型时wchar_t |
u8"hello,world!" | utf-8字面值 |
10ULL | 无符号长整型 |
1E-3F | 单精度浮点型字面值,类型是float |
3.1415926L | 扩展精度浮点型字面值 |
1.3.5、布尔字面值和指针字面值
true和false是布尔类型的字面值,而对于指针,在c++11版中,他的字面值是nullptr。这个放到后面介绍指针时详细介绍。