数据类型
- 数据类型将会决定一个变量存储什么样的信息,从而决定变量的容量有多大,在内存中需要分配多大的空间。
- C++中的数据类型分为基本类型和复合类型:
- 其中基本类型包括了整数、浮点数,
- 复合类型是在基本类型的基础上创建的,包括数组、字符串以及结构体等
整数类型
- 整数类型分为数值整数类型和字符类型。
整数类型—数值整数类型
-
数值整数用来表示没有小数部分的数字。
- 数值整数可以按照占用内存大小分为
short
、int
、long
以及long long
这四种,占用内存越大的类型能表示的数值范围就更大。 - 同时又可以按照是否表示负值分为有符号版本和无符号版本
- 数值整数可以按照占用内存大小分为
-
字符类型则专门用来存储计算机中的基本符号:英文字母、数字以及标点等。
-
表示范围
在数学中,整数的范围是无穷无尽的,但是计算机的内存是有限的,所以一种类型能表示的整数范围也是有限的。因此,在C++中,我们需要根据需求,选择合适的数值整数类型。
short
、int
、long
以及long long
这四种数值整数类型占用的字节数递增,所以能表示的整数范围也递增。short
类型至少占据2个字节,即16位;一般占用2字节;int
在现代系统中一般占用4个字节,即32位;类型长度大于等于short
类型;long
类型长度至少占据4个字节,且大于等于int
类型;一般占用4个字节;long long
类型长度至少占据8个字节,且大于等于long
类型;一般占用8个字节。
Tips: 为了避免不同的计算机系统的设计差异,C++提供了一个标准来保证各种类型的最小长度:
- 计算机内存采用二进制的存储方式,每一个位可以表示0与1两种状态,因此占据
n
n
n位的内存块,可以表示
2
n
2^n
2n个不同的数字。
- 比如一个 8 位的内存块,可以表示 2 的 8 次方个不同的组合,也就是说能表示 256 个不同的整数;
- 32 位的
int
类型,可以表示 2 32 2^{32} 232=4294967296232=4294967296 个不同的整数。
- 每个类型数据可以分别指定有符号版本和无符号版本,用来明确该类型是否需要表示负值。
- 比如
unsigned int
就表示无符号的int
类型,只能表示正值; signed int
就表示有符号的int
类型,可以表示负值。- 在不指定有无符号时,都默认是有符号版本。
- 比如
- 如果是无符号版本,那么一个8位的内存块可以一一对应到0~255之间的整数;
- 如果是有符号版本,那么就会考虑负数,这个8位的内存块可以表示一128~127之间的整数。
🌰
#include <iostream>
using namespace std;
int main() {
// TODO 声明 short 类型的变量 total_1,并初始化为48000
short total_1 = 48000;
cout << "总价为:" << total_1 << "元。\n";
// TODO 声明 unsigned short 类型的变量 total_2,并初始化为48000
unsigned short total_2 = 48000;
cout << "总价为:" << total_2 << "元。\n";
return 0;
}
整数类型-字符整数类型
- 字符类型
char
是另一种特殊的整数类型,它专门用来存储计算机中的基本符号:英文字母、数字以及标点等。
Tips: 计算机通过ASCII编码,将128个字符映射到对应数字上,于是我们使用一个字节(8位)就可以将所有的字符表示出来。通过查看内存,可以发现储存在类型为char
的变量中的实际上是一个整数,对应于这个字符的ASCII编码值。
所以,我们可以既可以使用字符常量,也可以使用字符对应的ASCII编码,来给char
类型的变量赋值。
- 字符整数类型虽然存储方式和数值整数类型相似,都是存放一个数值,但是在输出显示时是不同的。
#include <iostream>
using namespace std;
int main() {
// 初始化一个 int 类型
int length = 76;
// TODO 用字符常量初始化一个 char 类型 size_1 为L
char size_1 = 'L';
// TODO 用整数常量初始化一个 char 类型 size_2 为L,字符L的ASCII编码值为76
char size_2 = 76;
cout << "衣服的长度为:" << length << "厘米。\n";
cout << "衣服的大小为:" << size_1 << "号。\n";
cout << "衣服的大小为:" << size_2 << "号。\n";
return 0;
}
浮点类型
- 计算机用浮点数表示两类数:
- 带小数部分的数字; 例如:圆周率3.14、黄金分割比例0.618等,这些数字在整数之间
- 数值非常大的数字。 例如:宇宙中原子个数约10的80次方,这个数字已经无法被
long long
整型表示
- C++中的浮点数分为三种类型:
float
、double
以及long double
,分别表示不同的精度。 - 浮点数的精度在于它可以表示的有效位数以及指数范围。
- 指数范围指的是可以表示的指数幂次大小;
由于浮点数更多的应用是用来表示带小数的数字,所以我们主要从有效位数的角度讲解精度。
-
有效位数用来描述浮点数值的刻画精确程度。
例如:3.14的有效位数是3位,3.1415926的有效位数是8位。
Tips: 需要注意的是,有效位数不会因为小数点的改变而改变,无论314000或者3.14000,它们的有效位数都是3位,多出来0可以看作是一种占位符,因为实际有意义的数字只有3个:3、1和4。
- 在三种浮点类型中,更大的内存空间可以表示更多的有效位数:
float
类型通常占用4个字节,有效位数为6位double
类型占用的空间是float
类型的两倍,即8个字节,有效位数为15位long double
类型一般占用16个字节的空间
#include <iostream>
using namespace std;
int main() {
// TODO 声明并初始化一个float类型的变量 pi_1 为 3.1415926
float pi_1 = 3.1415926;
printf("圆周率为:%.7f。\n", pi_1); // 输出浮点数的7位小数
// TODO 声明并初始化一个double类型的变量 pi_2 为 3.1415926
double pi_2 = 3.1415926;
printf("圆周率为:%.7f。\n", pi_2); // 输出浮点数的7位小数
return 0;
}
位运算符与表达式
C++按位运算符
本节内容将介绍C++中按位进行的运算符,简称位运算。
- 在计算机中,数据以二进制的形式储存
- 每8位(bit)构成一个字节(byte)
- 每个位具有
0
或1
两种状态中的一种
Tips:通过多个字节组合,内存以二进制形式存放数值。例如,
- 字符类型
char
的常量7
大小为1个字节- 存储为
8
位二进制数:0000 0111
- 存储为
- 整数类型
int
的常量7
大小为4个字节- 存储为
32
位二进制数:0000 0000 0000 0000 0000 0000 0000 0111
- 存储为
C++中共包含6种按位运算符:
- 按位与运算符
&
- 按位或运算符
|
- 异或运算符
^
- 按位取反运算符
~
- 左移运算符
<<
- 右移运算符
>>
Tips:按位运算符只能对字符整型以及数值整型数据类型的常量或变量使用,不能对浮点类型数据进行计算。
位与运算符
- 按位与运算符
&
对两个操作数按照二进制位进行与运算。
Tips:对于操作数a
和b
,下表演示了&
运算符的工作方式:
Tips:&
运算符只有在两个操作数的对应位同时为1
时,才会得到结果1
。
位或运算符
- 按位或运算符
|
对两个操作数按照二进制位进行或运算。
Tips:对于操作数a
和b
,下表演示了|
运算符的工作方式:
Tips:或运算只要在两个操作数的对应位存在1
时,就可以得到结果1
。
位异或运算符
- 位异或运算符
^
对两个操作数按照二进制位进行异或运算。
Tips:对于操作数a
和b
,下面的真值表演示了^
运算符的工作方式:
Tips:异或运算在两个操作数的对应位不相同时,会得到结果1
;也可以看作是二进制下的无进位相加。
取反运算符
- C++中,取反运算符
~
对单个二进制操作数按位进行取反运算。
Tips:二进制位取反规则是0
变1
,1
变0
。
- 在计算机中,所有的二进制数据都是用补码保存的。
- 正数的补码就是原码本身
- 正数变量
A
的原码为0011 1100
,补码同样等于0011 1100
。
- 正数变量
- 负数的补码是在其原码的基础上,符号位不变,其余各位取反然后
+1
- 负数变量
~A
的原码为1100 0011
,补码等于1011 1100 + 1 = 1011 1101
,值为-61
,故~A = -61
。
- 负数变量
- 正数的补码就是原码本身
Tips:一个对操作数取反运算的简单规律是:会得到比原先操作数的相反数还小1
的结果。
左右移运算符
-
在C++中,
左移运算符
<<
可以将一个操作数的各二进制位全部左移若干位。- 左边多余的二进制位将被丢弃
- 右边不足的二进制位将被补
0
Tips:在结果符号位不改变,并且没有超过表示范围的情况下,左移运算符移动了几位,相当于对原操作数进行了几次乘2
运算。
-
在C++中,
右移运算符
>>
可以将一个操作数的各二进制位全部右移若干位。-
右侧多余的位将会被舍弃
-
左侧对于无符号数,会在左侧补
0
左移运算符<<
可以将一个操作数的各二进制位全部左移若干位。 -
左边多余的二进制位将被丢弃
-
右边不足的二进制位将被补
0
-
Tips:在结果符号位不改变,并且没有超过表示范围的情况下,左移运算符移动了几位,相当于对原操作数进行了几次乘2
运算。
-
在C++中,
右移运算符
>>
可以将一个操作数的各二进制位全部右移若干位。- 右侧多余的位将会被舍弃
- 左侧对于无符号数,会在左侧补
0
- 左侧对于有符号数,会用符号位补齐:正数为
0
,负数为1