什么是数据类型?
数据类型就是存储不同大小数字的容器。
整型
整型最常见的就是 int,占 4 个字节,即 4 * 8 = 32 比特,可以表达的整数个数为 ,由于包括负数,0,和正数,实际表示范围为 - ~ -1,如果是 unsigned int,即没有负数区间,表示范围为 0 ~-1。(暂时我们姑且这么认为,后面会讲到原码、反码和补码原理)。
cout << sizeof(123) << " " << sizeof(int) << endl;
输出:
4 4
然而,当 int 无法满足存储需要时,我们需要更大的数据类型 long long,占 8 个字节。
cout << sizeof(123456789123456789) << " " << sizeof(long long) << endl;
输出:
8 8
如果我们要将 123 这个整数声明为 long long 类型,可以加上后缀 ll 或 LL。
cout << sizeof(123ll) << " " << sizeof(456LL) << endl;
输出:
8 8
在实际编程过程中,如果需要多次使用 long long,我们可以通过 typedef 关键字将 long long 重命名为 LL。(注意:程序中最好不要出现小写 l,容易和数字 1 混淆)。
#include <iostream>
using namespace std;
typedef long long LL;
int main() {
LL a = 123;
cout << a << " " << sizeof(a) << endl;
return 0;
}
输出:
123 8
那么,我们什么时候需要用到 long long 呢?比如:
1.当题目中数据范围明显超出 int,比如 1000000 个数字,每个数字范围都是 int,求和。
2.比较隐晦,比如 20 的阶乘,结果 1 * 2 * 3 * …… * 20
。
如果不确定,直接开 long long 空间。(大多数情况对结果没有影响,但是当涉及到位运算时候可能对结果有影响,需要事前评估一下)
什么是 short?long 和 long long 有什么区别?
在C++ primer,或者c++标准书中是这样规定的:sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)
它并没有回答各个数据类型的具体长度,而是由编译器自行决定。
在我们考试的系统中,short 占 2 个字节,long 占 8 个字节。(大多数书上写的是 4 字节,这并不适用于 NOI Linux2.0 系统)
简而言之我们平时用的电脑是 Windows64 位;
我们所接触的大部分 OJ 都是 Linux64 位;
32 位系统因为随着时代的发展,电子设备内存越来越大,基本已经很少见了!
浮点型
float 占 4 字节,保留有效位数 7 位,double 占 8 字节,保留有效位数 16 位。一般在算法竞赛中,我们都使用 double。
浮点型默认为 double 类型,当然也可以通过后缀 f、F、L 改变类型。
cout << sizeof(1.23) << endl;
cout << sizeof(1.23f) << endl;
cout << sizeof(1.23F) << endl;
cout << sizeof(1.23L) << endl;
输出:
8
4
4
16
保留指定小数位数:需要引入库 #include <iomanip>
const double PI = 3.14;
cout << PI << endl;
cout << setprecision(6) << PI << endl;
cout << setprecision(6) << 3.14159265358 << endl;
cout << fixed << setprecision(6) << PI << endl;
输出:
3.14
3.14
3.14159
3.140000
注意:
1.必须加 fixed,否则实际输出位数可能会小于指定保留位数。
2.以上所有格式化控制符只对紧跟在其后的数据有作用。
布尔类型
布尔变量声明和赋值:
bool a;
bool a = true, b = false;
bool a = 0, b = 1;
输出布尔类型量:
如果值为真 (true),输出 1 ,如果值为假 (false),输出 0。
cout << true << " " << false; //输出:1 0
bool a = true, b = false;
cout << a << " " << b; //输出:1 0
布尔类型与其它类型的转换:
cout << bool(0.2) << endl; //输出:1
bool a = -1, b = 0;
cout << a << " " << b; //输出:1 0
int c = bool(3), d = false;
cout << c << " " << d << endl; //输出1 0
关系运算
逻辑运算
逻辑运算真值表:
判断一个数是否是另一个数的倍数:
优先级:
字符型
字符常量是由单个字符组成,所有字符采用 ASCII 编码,通用 ASCII 编码共有 128 个字符。在程序中通常用一对单引号将单个字符括起来表示一个字符常量。如:'a','0','A'。
ASCII 码表:
常用转义字符:
cout << "我是\n黑猫\t老师\n";
cout << "很高兴\x0A认识\x09你\n";
cout << "输出一个反斜杠\\";
输出:
我是
黑猫 老师
很高兴
认识 你
输出一个反斜杠\
数据类型隐式转换
隐式转换是指在编程语言中,由编译器自动执行的类型转换过程,而无需显式指定。这种转换是为了保持操作的一致性,使不同类型的数据能够在一些特定的上下文中进行运算或操作。隐式转换通常涉及到较小范围数据类型向较大范围数据类型的转换,以避免数据丢失或提高精度。