简单了解下什么是基础变量类型
由于有过编程经验,这里就速通了,大多数语言的基础变量类型就是由整数,浮点数,布尔类型,字符等,通过这些基本类型组成我们所需要的复杂对象,例如整数可以记录人的年龄,浮点数可以记录人的身高体重,布尔类型可以记录该对象是否是VIP,以及通过字符记录一些描述等等....
C++的基本类型
C++基本类型由整数,浮点数,布尔类型,字符组成。
整数
由short,int,long longlong组成。
| 类型 | 占用字节数 | 特殊说明 |
|---|---|---|
| short | 至少2字节 | 无 |
| int | 至少2字节,最多4字节 | 无 |
| long | 至少4字节,最多8字节 | 不稳定,取决于操作系统的位数和编译器的数据模型,例如32位则最大是4字节,64位最大则是8字节,一般比较少用。 |
| longlong | 8字节 | 无 |
代码
using namespace std;
#include <iostream>
int main()
{
short myShort = 1;
int myInt = 2;
long myLong =INT_MAX;
long long myLongLong = 4;
std::cout << __cplusplus << std::endl;
cout << "myshort is "<< myShort <<" 所占用大小:"<<sizeof(short)<<"字节"<< endl;
cout << "myInt is "<< myInt <<" 所占用大小:"<<sizeof(int)<<"字节"<< endl;
cout << "myLong is "<< myLong <<" 所占用大小:"<<sizeof(long)<<"字节"<< endl;
cout << "myLongLong is "<< myLongLong <<" 所占用大小:"<<sizeof(long long)<<"字节"<< endl;
return 0;
}
代码运行结果
我是在win64位下运行的,但是long显示的是4个字节,体现了long的不稳定因素,因此在开发过程中,尽量避免使用long。问了一下AI老师,除了由操作系统决定,还有编译的主流数据模型相关。
浮点数
由float,double,long double组成。
代码
using namespace std;
#include <iostream>
int main()
{
float myFloat1 = 1.0f;
double myDouble1 = 3.14d;
double myDouble2 = 3.14e2d;
double myDouble3 = 3.14e-2d;
long double myLongDouble1 = 3.14L;
cout<<"myFloat1 is " <<myDouble1<<" 所占用字节是:"<<sizeof(float)<<endl;
cout<<"myDouble1 is " <<myDouble1<<" 所占用字节是:"<<sizeof(double)<<endl;
cout<<"myDouble2 is " <<myDouble2<<" 所占用字节是:"<<sizeof(double)<<endl;
cout<<"myDouble3 is " <<myDouble3<<" 所占用字节是:"<<sizeof(double)<<endl;
cout<<"myLongDouble is " <<myLongDouble1<<" 所占用字节是:"<<sizeof(long double)<<endl;
}
运行结果
布尔类型
由bool组成。
字符
由char,wchar_t,char16_t,char32_t组成。
char
char顾名思义就是设计用来存储字符的,很多系统的字符设计通常不超过128个,所以它是一个比short占用空间还小的变量类型,例如在ASCOII字符集中,A通常表示65。
wchar_t
wchar_t类型是由于char类型无法表示中文的一些字符而出现的,表示扩展字符集,对于底层的实现某些系统中可能是short,某些系统中可能是int,可通过前面加‘L’的方式表示wchar_t字符,由于wchar_t不常用,我们就不继续深究。注意wchar_t不能使用cin或者cout进行输入输出,官方提供了wcin和wcout函数。
char16_t和char32_t
由于Unicode国际编码逐渐完善,wchar_t已经力不从心,因此出现了char16_t和char32_t表示字符集,顾名思义就是char16位,char32位的表示,并通过小写‘u 'A'’表示char16_t和大写‘U 'A'’表示char32_t类型。
疑问
- 为什么有了wchar_t还会需要char16_t和char32_t呢? 问了一下Ai老师,是这样的,wchar_t的大小是因为平台规定的,char16_t和char32_t就是固定大小的,从移植性和适配上来讲wchar_t不再适应,而且wchar_t对Unicode适配度并不完善。
常量定义
通过const关键字进行定义。
using namespace std;
#include <iostream>
int main()
{
// 定义一个常量
const int MY_CONST = 1;
}
类型转换
C++中之间的类型转换与之前学过的语言类似,但需要记住转换的时机。
- 类型赋值和初始化时。
- 以{}方式初始化时进行转换。
- 表达式中的转换。
- 传递参数的时候转换。
- 强制类型转换。
类型赋值和初始化
类型赋值和初始化会根据当前定义的类型进行,例如我定义了一个short = INT_MAX,我的类型就是short,但由于赋值是INT_MAX,所以可能会导致数值溢出,不可预估的后果。
通过{}进行赋值和初始化
通过{}进行赋值和初始化的过程会比较严格,编译器通常不允许将大的值复制给小的定义类型,编译器在编译过程会对赋值进行检查。
using namespace std;
#include <iostream>
#include <climits>
int main()
{
short x{99999999};
}
运行结果:
表达式中转换
表达式中转换比较复杂,例如a = 3.14+3,存在整数和浮点数,但会遵循一定的规则。
- 如果操作数中存在浮点数,会优先转换为浮点数,以最高的浮点数为准,比如(3.14f+3+3.14d)最终结果会变成double。
- 否则,两个数都是整形,因此执行整形提升,看谁的优先级比较高,long long > long>int>short>char。
- 如果一个操作数有符号,一个操作数无符号,则以最高优先级的操作数为准进行转换,浮点数>整数。
强制转换
强制转换可以通过(int)3.14进行转换,但会丢失精度。