• C++数据类型总结,看这一篇就够了


    1 C++数据类型

    #include  //定义了符号常量来表示整型类型的限制,包括了符号常量CHAR_BIT,CHAR_MAX,CHAR_MIN等等
    #include  //定义了符号常量浮点类型的限制,包括了符号常量DBL_DIG,FLT_DIG等等
    
    • 1
    • 2

    1.1 变量及函数命名规范

    1. 在名称中只能使用数字、字符、下划线;
    2. 名称的首字符不能是数字;
    3. 区分大小写;
    4. 不能使用C++关键字;
    5. 以两个下划线打头的名称被预留给编译器和源文件使用,以一个下划线打头的名称预留为全局标识符;
    6. C++不做长度限制,认为名称中的所有字符都有意义;但是不同的平台可能有自己的长度限制。

    对于变量,为什么一定是先定义,再赋值?
    防止程序员敲错变量名以至于新建了新的变量,从而导致调试时难以找出问题。

    1.2 整型类型

    1.2.1 char类型

    • CHAR_BIT — char类型的位数
    • CHAR_MAX — char类型的最大值
    • CHAR_MIN — char类型的最小
    • SCHAR_MAX — signed char类型的最大值
    • SCHAR_MIN — signed char类型的最小值
    • UCHAR_MAX — unsigned char类型的最大值

    注意:char类型的负值显示不出来

    1.2.2 其他char类型

    1.2.2.1 wchar_t

    字符集太多,8位的char类型无法表示,使用wchar_t(宽字符类型)表示拓展字符集。前缀:L
    它的长度和符合属性和另一种底层类型相同,具体是那种底层类型取决于实现。

    1.2.2.2 char16_t

    无符号16位,前缀:u

    1.2.2.3 char32_t

    无符号32位,前缀:U

    1.2.3 short类型

    C++要求short类型不少于16位
    根据实验结果判断,本系统中short类型是16位的

    • SHRT_MAX — short类型的最大值
    • SHRT_MIN — short类型的最小值
    • USHRT_MAX — unsigned short类型的最大值

    1.2.4 int类型

    C++要求int类型至少与short类型一样长
    根据实验结果判断,本系统中int类型是32位的

    • INT_MAX — int类型的最大值
    • INT_MIN — int类型的最小值
    • UNIT_MAX — unsigned int类型的最大值

    1.2.5 long类型

    C++要求long至少为32位,且至少与int一样长
    根据实验结果判断,本系统中long类型是32位的

    • LONG_MAX — long类型的最大值
    • LONG_MIN — long类型的最小值
    • ULONG_MAX — unsigned long类型的最大值
    • long类型后缀 L or l
    • unsigned long类型后缀 UL or ul or Ul or uL or LU or lu or lU or Lu

    1.2.6 long long类型

    C++要求long long至少为64位,且至少与long一样长
    根据实验结果判断,本系统中long long类型是64位的

    • LLONG_MAX — long类型的最大值
    • LLONG_MIN — long类型的最小值
    • ULLONG_MAX — unsigned long类型的最大值
    • long long类型后缀:LL or ll
    • unsigned long long类型后缀:ULL or ull or Ull or uLL

    1.2.7 bool类型

    只有一位 1表示True 0表示False
    有数据表示为True,0表示为False

    1.3 浮点类型

    浮点数书写:

    • 1…dddddd.ddddd…
    • 2.d.dddE+n and d.dddE-n

    1.3.1 float类型

    C++要求至少为32位。后缀F or f

    • FLT_DIG — float类型最小有效位数
    • FLT_MANT_DIG — float类型用来表示尾数的位数
    • FLT_MAX_10_EXP — float类型最大指数值
    • FLT_MIN_10_EXP — float类型最小指数值

    1.3.2 double类型

    C++要求至少为48位,且不少于float

    • DBL_DIG —double类型最小有效位数
    • DBL_MANT_DIG —double类型用来表示尾数的位数
    • DBL_MAX_10_EXP —double类型最大指数值
    • DBL_MIN_10_EXP —double类型最小指数值

    1.3.3 long double类型

    C++要求为80,96,128位,至少和double类型位数一样多

    • LDBL_DIG — long double类型最小有效位数
    • LDBL_MANT_DIG — long double类型用来表示尾数的位数
    • LDBL_MAX_10_EXP — long double类型最大指数值
    • LDBL_MIN_10_EXP — long double类型最小指数值

    1.4 进制

    • 二进制 binary
    • 八进制 octal
    • 十进制 decimal
    • 十六进制 hex

    1.5 转义字符

    • 换行符 \n
    • 水平制表符 \t
    • 垂直制表符 \v
    • 退格 \b
    • 回车 \r
    • 反斜杠 \
    • 问号 ?
    • 单引号 ’
    • 双引号 "

    1.6 sizeof()

    sizeof() — 计算变量所占内存空间,以字节为单位
    sizeof的使用方式:sizeof(var) or sizeof var

    • 1.将sizeof用于普通变量时,计算改变量所占内存空间;
    • 2.将sizeof用于数组时,计算整个数组所占内存空间;将sizeof用于数组元素时,计算单个数组元素所占内存空间;

    1.7 auto关键字

    可以让编译器根据初始值的类型推断变量的类型,只能用于单值初始化,不能用于多值初始化

    1.8 decltype关键字

    1.8.1 decltype应用于模板

    关键字decltype将变量的类型声明为表达式的指定的类型。
    decltype的工作原理比auto的复杂,根据指定的表达式,指定的类型可以为const或引用
    格式:decltype(x) y;//其中x为表达式,此式将把y声明为x表达式的类型

    应用于模板:

    template<typename T, typename U)
    void ef(T t, U u)
    {
        decltype(T*U) tu;
        ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.8.2 返回类型后置

    在函数名和参数列表后面指定返回值类型:

    auto f2(double, int) -> double; // new syntax, return type is double
    
    • 1

    与decltype组合用于模板:使用返回类型后置的原因是在遇到eff前,T和U还不在作用域内,因此需要将其放在后面

    template<typename T, typename U)
    auto eff(T t, U u) -> decltype(T*U)
    {
        ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.9 nullptr

    nullptr表示一个空指针,它是一个指针不能转换为int类型;为了兼容老版本 nullptr==0 依然会返回true;
    但是使用nullptr具备更好的安全性,比如不能将nullptr作为形参类型为int类型的实参。

    1.10 举例

    代码:

    /*
    Project name :			_1Data_type
    Last modified Date:		2022年3月10日14点41分
    Last Version:			V1.0
    Descriptions:			总结C++中的数据类型
    */
    #include 
    #include  //定义了符号常量来表示整型类型的限制,包括了符号常量CHAR_BIT,CHAR_MAX,CHAR_MIN等等
    #include  //定义了符号常量浮点类型的限制,包括了符号常量DBL_DIG,FLT_DIG等等
    #include
    
    int main()
    {
    	using namespace std;
    	cout << "整型类型******************************************************************" << endl;
    	cout << "char类型******************************************************************" << endl;
    	char var_char = 'a';//定义+赋值传统方法
    	char var_char1('b');//定义+赋值新方法
    	signed char var_char2 = {'x'};//定义+赋值新方法
    	unsigned char var_char3('y');
    	cout << "Data Type char:var_char = " << var_char<<endl; //Data Type char:var_char = a
    	cout << "sizeof(char) = " << sizeof(char) << endl; //sizeof(char) = 1---表示1个字节
    	cout << "CHAR_BIT = " << CHAR_BIT<<endl; //CHAR_BIT = 8
    	cout << "CHAR_MAX = " << CHAR_MAX<<endl; //CHAR_MAX = 127
    	cout << "CHAR_MIN = " << CHAR_MIN <<endl; //CHAR_MIN = -128
    	cout << "Data Type signed char:var_char2 = " << var_char2 << endl; //Data Type signed char:var_char2 = x
    	cout << "SCHAR_MAX = " << SCHAR_MAX << endl; //CHAR_MAX = 127
    	cout << "SCHAR_MIN = " << SCHAR_MIN << endl; //CHAR_MIN = -128
    	cout << "Data Type unsigned char:var_char3 = " << var_char3 << endl; //Data Type unsigned char:var_char3 = y
    	cout << "UCHAR_MAX = " << UCHAR_MAX << endl; //CHAR_MAX = 255
        
    	cout << "wchar_t类型******************************************************************" << endl;
    	wchar_t var_wchar_t = L'P';//定义+赋值传统方法
    	wcout << "Data Type char:var_wchar_t = " << var_wchar_t << endl; //Data Type char:var_char = a
    	cout << "sizeof(wchar_t) = " << sizeof(wchar_t) << endl; //sizeof(wchar_t) = 2---表示2个字节
    	
        cout << "char16_t and char32_t类型******************************************************************" << endl;
    	char16_t var_char16_t = u'P';//定义+赋值传统方法
    	cout << "Data Type char16_t:var_char16_t = " << var_char16_t << endl; //Data Type char16_t:var_char16_t = 80 输出的是Unicode编码
    	cout << "sizeof(char16_t) = " << sizeof(char16_t) << endl; //sizeof(char16_t) = 2---表示2个字节
    	char32_t var_char32_t = U'P';//定义+赋值传统方法
    	cout << "Data Type char16_t:var_char32_t = " << var_char32_t << endl; //Data Type char16_t:var_char32_t = 80 输出的是Unicode编码
    	cout << "sizeof(char32_t) = " << sizeof(char32_t) << endl; //sizeof(char32_t) = 4---表示4个字节
    	
    	cout << "short类型******************************************************************" << endl;
    	short var_short = 99;//定义+赋值传统方法
    	unsigned short var_short1(88);//定义+赋值新方法
    	short var_short2 = { 99 };//定义+赋值新方法
    	cout << "Data Type short:var_short = " << var_short << endl; //Data Type short:var_short = 99
    	cout << "sizeof(short) = " << sizeof(short) << endl; //sizeof(short) = 2---表示2个字节
    	cout << "SHRT_MAX = " << SHRT_MAX << endl; //SHRT_MAX = 32767
    	cout << "SHRT_MIN = " << SHRT_MIN << endl; //SHRT_MAX = -32768
    	cout << "Data Type unsigned short:var_short1 = " << var_short1 << endl; //Data Type unsigned short:var_short1 = 88
    	cout << "USHRT_MAX = " << USHRT_MAX << endl; //USHRT_MAX = 65535
    
    	cout << "int类型******************************************************************" << endl;
    	int var_int = 99;//定义+赋值传统方法
    	unsigned int var_int1(88);//定义+赋值新方法
    	unsigned int var_int2 = {999};//定义+赋值新方法
    	cout << "Data Type int:var_int = " << var_int << endl; //Data Type int:var_int = 99
    	cout << "sizeof(int) = " << sizeof(int) << endl; //sizeof(int) = 4---表示4个字节
    	cout << "INT_MAX = " << INT_MAX << endl; //INT_MAX = 2147483647
    	cout << "INT_MIN = " << INT_MIN << endl; //INT_MIN = -2147483648
    	cout << "Data Type unsigned int:var_in1t = " << var_int1 << endl; //Data Type unsigned int:var_in1t = 88
    	cout << "UINT_MAX = " << UINT_MAX << endl; //UINT_MAX = 4294967295
    
    	cout << "long类型******************************************************************" << endl;
    	long var_long = 2147483647;//定义+赋值传统方法
    	unsigned long var_long1(4294967295);//定义+赋值新方法
    	unsigned long var_long2 = {9999};//定义+赋值新方法
    	cout << "Data Type long:var_long = " << var_long << endl; //Data Type long:var_long = 2147483647
    	cout << "sizeof(long) = " << sizeof(long) << endl; //sizeof(long) = 4---表示4个字节
    	cout << "LONG_MAX = " << LONG_MAX << endl; //INT_MAX = 2147483647
    	cout << "LONG_MIN = " << LONG_MIN << endl; //INT_MIN = -2147483648
    
    	cout << "Data Type unsigned long:var_long1 = " << var_long1 << endl; //Data Type unsigned long:var_long1 = 4294967295
    	cout << "ULONG_MAX = " << ULONG_MAX << endl; //ULONG_MAX = 4294967295
    
    	cout << "long long类型******************************************************************" << endl;
    	long long var_long_long = 2147483647;//定义+赋值传统方法
    	unsigned long long var_long_long1(4294967295);//定义+赋值新方法
    	unsigned long long var_long_long2 = {999999};//定义+赋值新方法
    	cout << "Data Type long long:var_long_long = " << var_long_long << endl; //Data Type long long:var_long_long = 2147483647
    	cout << "sizeof(long long) = " << sizeof(long long) << endl; //sizeof(long long) = 8---表示8个字节
    	cout << "LLONG_MAX = " << LLONG_MAX << endl; //LLONG_MAX = 9223372036854775807
    	cout << "LLONG_MIN = " << LLONG_MIN << endl; //LLONG_MIN = -9223372036854775808
    
    	cout << "Data Type unsigned long long:var_long_long1 = " << var_long_long1 << endl; //Data Type unsigned long long:var_long_long1 = 4294967295
    	cout << "ULLONG_MAX = " << ULLONG_MAX << endl; //ULLONG_MAX = 18446744073709551615
    
    	cout << "bool类型******************************************************************" << endl;
    	bool var_bool = -11;
    	cout << "Data Type bool:var_bool = " << var_bool << endl; //Data Type bool:var_bool = 1
    
    	cout << "浮点类型******************************************************************" << endl;
    
    	cout << "float类型******************************************************************" << endl;
    	cout.setf(ios_base::fixed, ios_base::floatfield);//设置cout浮点显示
    	float var_float = 9.999;
    	cout << "Data Type float:var_float = " << var_float << endl; //Data Type float:var_float = 9.999000
    	cout << "sizeof(float) = " << sizeof(float) << endl; //sizeof(float) = 4---整形部分占用4个字节
    	cout << "FLT_DIG = " << FLT_DIG << endl; //FLT_DIG = 6
    	cout << "FLT_MANT_DIG = " << FLT_MANT_DIG << endl; //FLT_MANT_DIG = 24
    	cout << "FLT_MAX_10_EXP = " << FLT_MAX_10_EXP << endl; //FLT_MAX_10_EXP = 38
    	cout << "FLT_MIN_10_EXP = " << FLT_MIN_10_EXP << endl; //FLT_MIN_10_EXP = -37
    
    	cout << "double类型******************************************************************" << endl;
    	double var_double = 9.999;
    	cout << "Data Type double:var_double = " << var_double << endl; //Data Type double:var_double = 9.999000
    	cout << "sizeof(double) = " << sizeof(double) << endl; //sizeof(double) = 8---整形部分占用8个字节
    	cout << "DBL_DIG = " << DBL_DIG << endl; //DBL_DIG = 15
    	cout << "DBL_MANT_DIG = " << DBL_MANT_DIG << endl; //DBL_MANT_DIG = 53
    	cout << "DBL_MAX_10_EXP = " << DBL_MAX_10_EXP << endl; //DBL_MAX_10_EXP = 308
    	cout << "DBL_MIN_10_EXP = " << DBL_MIN_10_EXP << endl; //DBL_MIN_10_EXP = -307
    
    	cout << "long double类型******************************************************************" << endl;
    	long double var_long_double = 9.999;
    	cout << "Data Type long double:var_long_double = " << var_long_double << endl; //Data Type long double:var_long_double = 9.999000
    	cout << "sizeof(long double) = " << sizeof(long double) << endl; //sizeof(long double) = 8---整形部分占用8个字节
    	cout << "LDBL_DIG = " << LDBL_DIG << endl; //LDBL_DIG = 15
    	cout << "LDBL_MANT_DIG = " << LDBL_MANT_DIG << endl; //LDBL_MANT_DIG = 53
    	cout << "LDBL_MAX_10_EXP = " << LDBL_MAX_10_EXP << endl; //LDBL_MAX_10_EXP = 308
    	cout << "LDBL_MIN_10_EXP = " << LDBL_MIN_10_EXP << endl; //LDBL_MIN_10_EXP = -307
    
    	cout << "进制******************************************************************" << endl;
    	int var_int_data = 2147483647;
    	cout << "var_int_data = " << (bitset<32>) var_int_data << "(binary for 2147483647)"<<endl;//var_int_data = 01111111111111111111111111111111(binary for 2147483647)
    	cout << oct;//设置cout为八进制输出,下次需要输出不同进制时要重新设置为相应的模式
    	cout << "var_int_data = " << var_int_data << "(octal for 2147483647)"<<endl;//var_int_data = 17777777777(octal for 2147483647)
    	cout << dec;//设置cout为十进制输出,下次需要输出不同进制时要重新设置为相应的模式
    	cout << "var_int_data = " << var_int_data << "(decimal for 2147483647)" << endl;//var_int_data = 2147483647(decimal for 2147483647)
    	cout << hex;//设置cout为十六进制输出,下次需要输出不同进制时要重新设置为相应的模式
    	cout << "var_int_data = " << var_int_data << "(hex for 2147483647)" << endl;//var_int_data = 7fffffff(hex for 2147483647)
    	cout << dec;
    	
    	cout << "sizeof*****************************************************************" << endl;
    	int var = 10;
    	int vars[4] = {1,2,3,4};
    	cout << "sizeof(var) = " << sizeof(var) << endl;//sizeof(var) = 4
    	cout << "sizeof(vars) = " << sizeof(vars) << endl;//sizeof(vars) = 16
    	cout << "sizeof(vars[1]) = " << sizeof(vars[1]) << endl;//sizeof(vars[1]) = 4
    
    	cout << "auto********************************************************************" << endl;
    	cout.setf(ios_base::fixed, ios_base::floatfield);
    	auto n = 100;//n是int类型
    	cout << "n = " << n << endl;
    	auto x = 1.5;//x是double类型
    	cout << "x = " << x << endl;
    	auto y = 1.3e12L;//y是long double类型
    	cout << "y = " << y << endl;
    
    	double x;
    	int n;
    	decltype(x* n) q; // q same type as x*n, i.e., double
    	decltype(&x) pd; // pd same as &x, i.e., double *
    	int j = 3;
    	int& k = j;
    	const int& n = j;
    	decltype(n) i1 = j; // i1 type const int &
    	decltype(j) i2 = j; // i2 type int
    	decltype((j)) i3 = j; // i3 type int &
    	decltype(k + 1) i4 = j; // i4 type int
    	
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165

    运行结果:

    自动类型转换*********************************************************
    初始化和赋值进行的转换(传统=赋值)************************************
    (1)******************************************************************
    var_double = 9.897654
    var_float = 9.897655
    (2)******************************************************************
    var_double1 = 9.897654
    var_int = 9
    (3)******************************************************************
    var_long = 2147483647
    var_short = -1
    (4)******************************************************************
    var_bool = true
    var_bool = false{}方式初始化时进行的转换(C++11允许)************************************
    (1)******************************************************************
    var_long1 = 2147483647
    (2)******************************************************************
    var_double2 = 9.897654
    表达式中的转换************************************
    var_double3 + var_long_double = 999.998000
    
    D:\Prj\_C++Self\_3Typecast\Debug\_3Typecast.exe (进程 14084)已退出,代码为 0。
    要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
    按任意键关闭此窗口. . .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    2 README

    此为本人读C++ Primer总结的笔记,如有错误或知识缺口,请在评论区告知。如本文有在实践中帮到您,是本人的荣幸。

  • 相关阅读:
    属性和字段的区别
    Java文件读取方式和效率性能对比
    我的第一个Servlet程序,并理解浏览器和代码如何关联在一起
    9.MySQL函数
    FineReport智能数据图表- 文本域控件
    【Git】的分支和标签的讲解及实际应用场景
    服务器带宽跑满是什么原因
    WebGL 与 WebGPU比对[4] - Uniform
    基于vue+html的Web网页音乐播放器设计
    OpenGL LUT滤镜算法解析
  • 原文地址:https://blog.csdn.net/weixin_44410704/article/details/127792325