一 简单变量
1、数据类型的长度:
#include<iostream>
#include<climits>
int main() {
using namespace std;
int n_int = INT_MAX;
short n_short = SHRT_MAX;
long n_long = LONG_MAX;
long long n_llong = LLONG_MAX;
cout << "int is " << sizeof n_int << " bytes" << endl;
cout << "short is " << sizeof n_short << " bytes" << endl;
cout << "long is " << sizeof n_long << " bytes" << endl;
cout << "longlong is " << sizeof n_llong << " bytes" << endl;
cout << endl;
cout << "Maximum values: " << endl;
cout << "int is " << n_int << " bytes" << endl;
cout << "short is " << n_short << " bytes" << endl;
cout << "long is " << n_long << " bytes" << endl;
cout << "longlong is " << n_llong << " bytes" << endl;
cout << "Minimum int value: " << INT_MIN << endl;
cout << "bit per byte = " << CHAR_BIT << endl;
return 0;
}
2、预处理器方式
- include和#define都是预处理器编译指令,但是#define是c语言遗留下来的,在一些设计为C/C++通用的头文件中使用。然而 c++有一种更好的创建符号常量的方法:使用关键字const。
3、C++11的初始化方式
int rose{7}
int rose = {7}
int rose = {}
int rose{}
这是一种通用的初始化方法,大括号使得变量的赋值可以是不同的类型。
- 不推荐
4、无符号类型
扩大了数据可存储的最大值(翻倍),且为非负数。
for example: short 存储范围-32768~32767,unsigned short 存储范围为0~65535
5、cout输出控制符:进制转换
#include <iostream>
using namespace std;
int main() {
int chest = 42;
int waist = 42;
int inseam = 42;
cout << "chest = " << chest << " decimal for 42" << endl; //cout输出默认为十进制
cout << hex;//十六进制
cout << "waist = " << waist << " hexadecimal for 42" << endl;
cout << oct;
cout << "inseam = " << inseam << " octal for 42" << endl;
}
二 浮点数
1、精度问题
浮点数:float,double,long double的精度都比整型低,且运算速度比整型慢。
一般用double双精度,而不是float,因为float能显示的位数实在有限。
2、浮点常量默认为double类型
3、类型转换
3.1 转换行为:
转换 | 问题 |
---|---|
大浮点型->小浮点型 | 精度降低 |
浮点型->整型 | 截取整数部分,舍弃小数部分,可能存储溢出 |
大整型–>小整型 | 溢出取值范围,通常只复制右边的字节 |
复杂的类型转换:使用{},在初始化时进行转换。
3.2 表达式中的类型转换
运算 | 转换规则 |
---|---|
不同类型混合 | 较小的类型转换为较大的类型 |
整型运算 | 进行运算时会自动转换为int型进行计算之后再转换为原类型。 |
整型提升 | 小->大 |
- 如果有一个操作数的类型是long double,则将另一个操作数转换为long double。
- 否则,如果有一个操作数的类型是double,则将另一个操作数转换为double。
- 否则,如果有一个操作数的类型是float,则将另一个操作数转换为float。
- 否则,说明操作数都是整型,因此执行整型提升。
- 在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。
- 如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高,则将有符号操作数转换为无符号操作数所属的类型。
- 否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。
- 否则,将两个操作数都转换为有符号类型的无符号版本
类型级别:由高到低:有符号整型long long, long, int, short, signed char;无符号整型与有符号整型相同。类型char,signed char,unsigned char的级别相同。bool类型的级别最低。
3.3 传递参数时的转换:类型转换由函数原型控制
4、强制类型转换
上述转换为计算机的隐式转换,强制转换为显式。表达式有以下两种:
(typename) value //C语言用法
typename (value) //C++用法
示例代码
int main() {
int auks, bats, coots;
auks = 19.99 + 11.99;
bats = (int)19.99 + (int)11.99;
coots = int(19.99) + int(11.99);
cout << "auks = " << auks << ",bats = " << bats;
cout << ",coots = " << coots << endl;
char ch = 'Z';
cout << "ch的int型为:" << int(ch) << endl;
cout << static_cast<int>(ch) << endl;//static_cast是C++中四种强制类型转换运算符之一,可以进行数值类型转换
return 0;
}
5.auto声明
auto是C++中重新进行了定义,可以用于根据初始值类型推断变量的类型。,但是在简单初始化中,自动类型推断可能会出错。只有在处理复杂类型时,auto的优势才能显现出来。
能显现出来。