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