1、布尔型(bool)
bool
是占一个字节的逻辑值,定义出来的变量只有true
和false
两个,分别表示真和假,对应1
和0
两个值。所以比较好理解的是,在C语言中我们常常定义一个int
类型的troop
逻辑变量,也只有1
和0
两个值表示真和假。在C++中专门有这样一个数据类型应该是方便我们使用。
例如,
#include <iostream> using namespace std; bool compar(int a,int b) { if (a>=b) return true; else if (a<b) return false; } int main() { int a,b; bool y; //bool值可以进行运算 cout<<y<<endl<<(y+1)*2<<endl<<2*true+false+1; y = true; cin>>a>>b; cout<<compar(a,b); return 0; }
2、整数类型(int)
int
是一种数据类型,在编程语言(C、C++、C#、Java等)中,是用于定义整数类型变量的标识符。C 语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负。int
是整型之一,一般被称为整型。int
代表有符号整数,也就是说,用int
声明的变量可以是正数,可以是负数,也可以是零,但是只能是整数。标准规定int的最小取值范围是 -32767
到 32767
。int
的取值范围因机器而异,但是一定要大于或者等于 -32767
到 32767
。标准整数类型的存储大小和值范围,如下表,
类型 | 位 | 范围 |
int | 4 个字节 | -2147483648 到 2147483647 |
unsigned int | 4 个字节 | 0 到 4294967295 |
signed int | 4 个字节 | -2147483648 到 2147483647 |
short int | 2 个字节 | -32768 到 32767 |
unsigned short int | 2 个字节 | 0 到 65,535 |
signed short int | 2 个字节 | -32768 到 32767 |
long int | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
signed long int | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
unsigned long int | 8 个字节 | 0 到 18,446,744,073,709,551,615 |
为了得到某个类型或某个变量在特定平台上的准确大小,可以使用 sizeof
运算符。表达式 sizeof(type)
得到对象或类型的存储字节大小。
#include <iostream> using namespace std; int main() { int a,b=2; cin>>a>>b; cout<<a<<endl<<b; return 0; }
3、浮点类型
每当需要带小数的数字(例如,9.99
或3.14515
)时,都应使用浮点类型。标准浮点类型的存储大小、值范围和精度,如下表,
类型 | 位 | 范围 |
float | 4 个字节 | 精度型占4个字节(32位)内存空间, +/- 3.4e +/- 38 (~7 个数字) |
double | 8 个字节 | 双精度型占8 个字节(64位)内存空间, +/- 1.7e +/- 308 (~15 个数字) |
long double | 16 个字节 | 长双精度型 16 个字节(128位)内存空间, 可提供18-19位有效数字。 |
例如,
#include <iostream> using namespace std; int main() { float distance = 1.496E8; double mass = 1.989E30; cout << "distance = " << distance << endl; cout << "mass = " << mass ; return 0; }
4、字符类型
char类型的值占用所有数据类型的最小内存量。通常只需要一个字节。char
不仅是一种整数,也是一种特殊的类型:字符(character)。可以通过字符常量为char类型的变量指定初始值。
1)字符常量可以只是单引号之间的字符。常用单引号表示字符的字面量,如,'a'
,'1'
。单引号''
也是一个字符,例如,
#include <iostream> using namespace std; int main() { char c; char d; c = 1; d = '1';//将字符赋值给一个char变量 if(c == d){ cout << "相等" << endl; }else{ cout << "不相等" << endl; } cout << "c=" << c << endl; cout << "d=" << d << endl; return 0; }
注意:char整数类型和字符类型不相等,如1
与'1'
,一个是数字,一个是字符。
2)字符的输入输出
#include <iostream> using namespace std; int main() { char c; char d; cin>>c>>d;//以下面两种形式输出 cout << "c=" << c << endl;//以整数值是多少 cout << "d=" << d << endl; return 0; }
3)字符计算
C++中字符是一种整数,可以做运算。例如,
#include <iostream> using namespace std; int main() { char c = 'A'; c++; cout << "c=" << c << endl; return 0; }
5、void 类型和指针型(*)
void
类型其实是一种用于语法性的类型,而不是数据类型,主要用于作为函数的参数或返回值,或者定义void
指针,表示一种未知类型。无值型字节长度为0, 主要有两个用途:
1)明确地表示一个函数不返回任何值;
2)可以产生一个同一类型指针(可根据需要动态分配给其内存)。 类型为 void * 的指针代表对象的地址,而不是类型。
例如,
#include <stdio.h> int main() { void *ptr = NULL; //void 指针 void *buffer; /*buffer被定义为无值型指针*/ int *p = NULL;// 整型指针 char *cp = NULL;//字符指针 float *fp = NULL;//浮点指针 return 0; }
6、宽字符型(wchar_t)
宽字符wchar_t
的长度16位,可以用来显示中文等除英文外的其他文字。
例如,
#include<iostream> #include<locale> using namespace std; int main() { setlocale(LC_ALL, "chs");//指定字符区域为中文 wchar_t st[] = L"中文的"; char stc[] = "中文的"; wcout<<st<<endl;//宽字符类型数组的内容:"中文的" cout<<stc<<endl;//单字符类型的内容:"中文的" cout<<st<<endl;//宽字符类型数组的地址 cout<<&stc<<endl;//单字符类型的地址 cout<<sizeof(st)<<endl;//宽字符类型数组的大小:3*2+2 = 8; cout<<sizeof(stc)<<endl;//单字符类型数组的大小:6*1+1 = 7; //中文字符以两个单字符存储 cout<<"------------------------------"<<endl; cout<<sizeof(char)<<endl; cout<<sizeof(wchar_t)<<endl; return 0; }
1)转换函数
头文件 #include <stdlib>
//宽字符转换为窄字符 errno_t wcstombs_s( size_t *pReturnValue, //被修改的位数,作为返回的 char *mbstr, //转换后字符串(窄)的空间指针 size_t sizeInBytes, //我暂时理解为,允许操作窄字符缓冲区的字符的个数, //要比count大1,不能大过缓冲区最大长度 const wchar_t *wcstr, //指向要转换的宽字符字符串 size_t count ) ; //要转换的宽字符的个数; //窄字符转换为宽字符 errno_t mbstowcs_s( size_t *pReturnValue, //被修改的位数,作为返回的 wchar_t *wcstr, //转换后宽字符串的缓冲区指针 size_t sizeInWords, // 允许操作缓冲区中宽字符的个数 const char *mbstr, //指向要转换的窄字符的字符串 size_t count //要转换的窄字符的个数 );
2)将宽字节的字符串转换为窄字符的字符串
#include <string> #include <cstdlib> std::string ws2s(const std::wstring& ws) { // curLocale = "C"; std::string curLocale = setlocale(LC_ALL, NULL); //中文地区 setlocale(LC_ALL, "chs"); const wchar_t* _Source = ws.c_str(); //比要转换的宽字符个数大1 size_t _Dsize = ws.size() + 1; char *_Dest = new char[_Dsize]; //初始化缓冲区 memset(_Dest, 0, _Dsize); size_t i; wcstombs_s(&i, _Dest, _Dsize, _Source, ws.size()); std::cout << "i:" << i << std::endl; std::string result = _Dest; delete[]_Dest; //设置回原来的locale setlocale(LC_ALL, curLocale.c_str()); return result; }
3)将窄字节的字符串转换为宽字符的字符串
#include <string> #include <cstdlib> std::wstring s2ws(const std::string& s) { std::string curlLocale = setlocale(LC_ALL,NULL); setlocale(LC_ALL, "chs"); const char* _Source = s.c_str(); size_t _Dsize = s.size() + 1; wchar_t* _Dest = new wchar_t[_Dsize]; size_t i; mbstowcs_s(&i, _Dest, _Dsize, _Source, s.size()); std::wstring result = _Dest; delete[] _Dest; setlocale(LC_ALL, curlLocale.c_str()); return result; }