C++ 数据类型

C++ 中的数据类型可以分为基本数据类型(整型,字符型,浮点型,布尔型)、派生数据类型(数组,指针,引用)和用户定义数据类型(结构体,类,结构体,联合体,枚举), 每个变量在使用之前必须定义其数据类型。数据类型决定了变量存储的数据种类和占用的内存空间。选择合适的数据类型是编写高效、可靠的 C++ 程序的基础。本文主要介绍C++中数据类型(布尔型(bool)、整型(int)、浮点型(float)、双浮点型(double)、字符型(char)、无值型 (void)、宽字符型(wchar_t))。

1、布尔型(bool)

bool是占一个字节的逻辑值,定义出来的变量只有truefalse两个,分别表示真和假,对应10两个值。所以比较好理解的是,在C语言中我们常常定义一个int类型的troop逻辑变量,也只有10两个值表示真和假。在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 到 32767int的取值范围因机器而异,但是一定要大于或者等于 -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.993.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;
}
推荐阅读
cjavapy编程之路首页