C++基础变量类型(第一弹)

32 阅读5分钟

简单了解下什么是基础变量类型

由于有过编程经验,这里就速通了,大多数语言的基础变量类型就是由整数,浮点数,布尔类型,字符等,通过这些基本类型组成我们所需要的复杂对象,例如整数可以记录人的年龄,浮点数可以记录人的身高体重,布尔类型可以记录该对象是否是VIP,以及通过字符记录一些描述等等....

C++的基本类型

C++基本类型由整数,浮点数,布尔类型,字符组成。

整数

由short,int,long longlong组成。

类型占用字节数特殊说明
short至少2字节
int至少2字节,最多4字节
long至少4字节,最多8字节不稳定,取决于操作系统的位数和编译器的数据模型,例如32位则最大是4字节,64位最大则是8字节,一般比较少用。
longlong8字节

代码

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;
}

代码运行结果

image.png

我是在win64位下运行的,但是long显示的是4个字节,体现了long的不稳定因素,因此在开发过程中,尽量避免使用long。问了一下AI老师,除了由操作系统决定,还有编译的主流数据模型相关。

image.png

浮点数

由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;

}

运行结果

image.png

布尔类型

由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类型。

疑问

  1. 为什么有了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++中之间的类型转换与之前学过的语言类似,但需要记住转换的时机。

  1. 类型赋值和初始化时。
  2. 以{}方式初始化时进行转换。
  3. 表达式中的转换。
  4. 传递参数的时候转换。
  5. 强制类型转换。

类型赋值和初始化

类型赋值和初始化会根据当前定义的类型进行,例如我定义了一个short = INT_MAX,我的类型就是short,但由于赋值是INT_MAX,所以可能会导致数值溢出,不可预估的后果。

通过{}进行赋值和初始化

通过{}进行赋值和初始化的过程会比较严格,编译器通常不允许将大的值复制给小的定义类型,编译器在编译过程会对赋值进行检查。

using namespace std;
#include <iostream>
#include <climits>
int main()
{
    short x{99999999};
}

运行结果:

image.png

表达式中转换

表达式中转换比较复杂,例如a = 3.14+3,存在整数和浮点数,但会遵循一定的规则。

  1. 如果操作数中存在浮点数,会优先转换为浮点数,以最高的浮点数为准,比如(3.14f+3+3.14d)最终结果会变成double。
  2. 否则,两个数都是整形,因此执行整形提升,看谁的优先级比较高,long long > long>int>short>char。
  3. 如果一个操作数有符号,一个操作数无符号,则以最高优先级的操作数为准进行转换,浮点数>整数。

强制转换

强制转换可以通过(int)3.14进行转换,但会丢失精度。