数据类型可以分为 基本数据类型 和 非基本数据类型。
1.基本数据类型
整型 (int),布尔值类型(bool),浮点数类型(double),字符类型(char), void类型。
2.非基本数据类型
指针类型(type*),数组类型(type[]),引用类型(double&),数据结构(struct),类(class),枚举类型(enum)。
数据 可分为 常量 和 变量
1.1整数类型
整数类型可以分为:
short:占2个字节(32位,64位),分为short,unsigned short(无符号) ,signed short(有符号)。无符号可以只能表示非负整数,有符号即可以表示负整数也可以表示非负整数。无符号整数表示的正整数范围是有符号整数的2倍(整数类型都是这样)。不加修饰的short通常是表示有符号的。
int :4字节(32位,64位),分为int,unsigned int(无符号) ,signed int(有符号)。不加修饰的int通常是表示有符号的。
long :4字节(32位),8字节(64字节),分为long ,unsigned long (无符号) ,signed long (有符号)。不加修饰的long 通常是表示有符号的。
long long:8字节(32位,64位),分为long long,unsigned long long(无符号) ,signed long long(有符号)。不加修饰的long long通常是表示有符号的。
整数字面值常量:
整数字面值常量分为:十进制,八进制,十六进制。
以x或X(0x或0X)开头的字面值常量表示一个十六进制数值(基是16);以0开头但是后面没有x或X的字面值常量表示一个八进制数值(基是8);以0b开头的字面值常量便是一个二进制(基是2)
后缀U或u用于显式指定unsigned字面值常量,后缀L或l用于显式指定long字面值常量 ,后缀LL或ll用于显式指定long long字面值常量。比如
3是int 类型
3L是long int类型
3ULL是unsigned long long类型
1.2布尔值
一个布尔变量(bool)的取值或者是true或者是false,布尔变量常用于表示逻辑运算的结果。
字节大小(32位,64位):1字节,也就是8bit。
取值范围:true,false。
布尔值转换成整数时:true转为1,false转为0。
整数转换成布尔值时:非0整数值对应true,0对应false。
比如
int i = true; //此时i被赋值为1
bool b1 = 7; //因为7不是0,所以 b被赋值为true
在算术逻辑表达式和位逻辑表达式中,bool被自动转换成int进行运算,如果最终的计算结果需要转换成bool类型,那么就是非0为true,0为false。
比如
bool a = true;
bool b = false;
bool x = a + b; //a+b的结果是2,因此x的最终取值是true
bool y = a - b; //a-b的结果是0,因此x的最终取值是false
bool z = a||b; //a||b的结果是1,因此x的最终取值是true
指针也能被隐式转换成bool。其中非空指针对应true,值为nullptr的指针对应false。
1.3浮点数据类型
浮点数据类型分为 float(单精度),double(双精度),long double(扩展精度)。
float:4字节(32位,64位)
double:8字节(32位,64位)
long double:8字节
浮点数字面值常量:
默认情况下,浮点数字面值常量时double类型。
浮点数字面值常量内部不允许出现空格,例如65.43 e-21不是一个浮点数字面值常量。
定义一个float类型的浮点数字面值常量,则后缀加上f或者F:3.14159265f ,2.0f ,2.9e-3f
定义一个long double类型的浮点数字面值常量,则后缀加上l或者L:3.14159265f L,2.0fL,2.9e-3L
1.4字符类型
常用的字符集(比如不同自然语言的字符集:英文,中文,阿拉伯语...)和 字符编码方式(utf-8,gbk,gb2312....)有很多。为了反映和描述这种多样性,c++提供了一系列字符类型:
char:默认的字符类型,用于程序文本。char是c++实现所用的字符集,占1字节(32位和64位),取值范围 -128~127。
signed char(有符号):与char类似 带符号,既可以存放正值,也可以存放负值,取值范围:-127~127。
unsigned char(无符号):与char类似 但是不带符号 取值范围:0~255。
wchar_t(宽字符):用于存放Unicode等更大的字符集。unicode编码的字符一般以wchar_t类型存储。wchar_t数据类型一般为16位或32位,所能表示的字符数远超char型。(char是8位字符类型,最多只能包含256种字符,许多外文字符集所含的字符数目超过256个,char型无法表示。),比如对于汉字,韩文以及日文这样的字符,它们的每一个文字都占据两个字节。
char16_t:该类型存放UTF-16等16位字符集。
char32_t:该类型存放UTF-32等32位字符集。
一个char类型变量存放一个字符 ,字符的种类由实现版本所用的字符集决定。
比如
char ch = 'a';
字符类型执行算术运算和位逻辑运算
字符类型属于整型。因此,我们可以在字符类型上执行算术运算和位逻辑运算。
void digits()
{
for(int i = 0; i!= 10;i++)
{
cout<<static_cast<char>('0'+i);//'0先转换成int类型和i进行运算,然后通过
//static_cast<char>' 将int类型转换成char
}
}
字符字面值常量
字符字面值常量:单引号内的一个字符,比如‘a’,'0'等。
字符字面值常量的数据类型是char,它可以隐式地转换成当前机器所用的字符集中对应的整数值。例如,如果你的机器使用的是ASCII字符集,则‘0’的值是48。
转义字符也是单字符,比如‘\n’,‘\t’,‘\d’等。
我们可以把字符集中的字符表示成一个1-3位的八进制(\后面紧跟八进制数字)或者表示成16进制数(\x后紧跟十六进制数字)。其中,序列里十六进制数字的数量没有限制。如果遇到了第一个不是八进制数字或者十六进制数字的字符,则表明当前的八进制序列或者十六进制序列已经结束。
上述规则使得我们不但可以设法表示出字符集中的每一个字符,而且能把这些字符嵌入到一个长字符串中。
当我们在字符串中嵌入八进制数字常量时,常规的做法是使用3个数字,对于十六进制数字常量来说,我们使用两个数字。比如
char v1[] = "a\xah\129"; \\6个字符:‘a’ '\xa' 'h' '\12' '9' '\0'
char v2[] = "a\xah\127"; \\5个字符:‘a’ '\xa' 'h' '\127' '\0'
char v3[] = "a\xad\127";\\4个字符:‘a’ '\xad' 'h' '\127' '\0'
char v4[] = "a\xad\0127";\\4个字符:‘a’ '\xad' '\012' '7' '\0'
标准C中的wprintf()函数以及标准C++的iostream类库中的类和对象能提供wchar_t宽字符类型的相关操作。
#include <iostream>
#include <locale> //setlocale函数在locale头文件中定义
using namespace std;
int main()
{
//使用setlocale函数将本机的语言设置为中文简体
//LC_ALL表示设置所有的选项(包括金融货币、小数点,时间日期格式、语言字符串的使用习惯等),chs表示中文简体
setlocale(LC_ALL, "chs");
wchar_t wt[] = L"中国伟大复兴梦"; //大写字母L告诉编译器为"中"字分配两个字节的空间
wcout << wt << endl; //使用wcout来代替cout输出宽字符
return 0;
}
如何定义常量
1.使用#define宏定义(define是一个记号,表示后面的数字,在编译时编译器会把记号简单地替换成数字)
#define LENGTH 10
#define WIDTH 5
2.使用const常量关键字(const是声明了一个不可改变的变量并给其赋值)
const int LENGTH = 10;
const int WIDTH = 5;