浅析C++ 数据类型

 更新时间:2020年08月24日 09:44:16   作者:Dabelv  
这篇文章主要介绍了C++ 数据类型的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下

1.C++数据类型简介

C++是一种强类型语言,任何变量或函数必须遵循“先申明后使用”的原则。定义数据类型有两个方面的作用:一是决定该类型的数据在内存中如何存储,二是决定可对该类型的数据进行哪些合法的运算。

C++的数据类型分为基本数据类型和非基本数据类型。其中非基本数据类型称为复合数据类型或构造数据类型。为了能够体现C++语言和传统C语言在非基本数据类型上的区别,在这里把能够体现面向对象特性的非基本数据类型成为构造函数类型,而将其他非基本数据类型称为复合数据类型。C++的数据类型数据如下图所示:

基本数据类型是C++内部预定义的,又叫内置(built-in)数据类型。非基本数据类型则是用户根据需要按照C++语法规则创建的数据类型。在这里,构造数据类型和复合数据类型的区别在于:构造数据类型的实例叫做对象,它是属性和方法的集合。复合数据类型的实例叫变量,变量本身并无成员函数。构造数据类型的一个显著特征是在生成该数据类型的一个实例时,会自动调用该类型定义的构造函数。也就是说,构造数据类型实例的初始化工作是由构造函数完成的。

**注意:**用基本数据类型定义变量时,类型出现在前面,变量直接跟在类型之后。但是用复合数据类型定义变量时,变量却不一定完全位于类型之后。例如,定义一个数组int a[8],标识符a的数据类型是int[8],但是它出现在数据类型的中间部位。另外,定义或申明变量时,类型外一定不能加括号,例如用这种方式定义一个指针是不对的:(int*)p;,它的真实含义是将p转换为int*类型,是强制类型转换的语法形式。

2.宽字符型与单字符型

传统的字符型char是单字节字符型,存储的是该字符的ASCII码,占用一个字节。也可以把char理解成单字节整型,取值范围是-128~127。单字节无符号整数可以用unsigned char表示,取值范围是0-255。

VC++中,如果在一个字符串中包含汉字,每个汉字占用2个字节,每个字节的最高位都是1,宽字符占用多少字节与编译器的具体实现有关,以保证能够存储Unicode字符。VC++将wchar_t实现为2个字节,2个字节很显然不能表示所有的Unicode字符,但是通过当前系统的语言环境进行编码转换,两个字节最大能够表示65536个字符,足以表示某个国家的文字。

单字节字符是无法容纳一个汉字字符的,如定义char c='好';将得到一条编译警告信息,并且只有低字节编码会存放在字符变量c中。

C++语言同时支持宽字符类型(wchar_t),用于表示Unicode字符。为了支持Unicode字符的处理,C++在库函数中定义了相应的Unicode字符的处理函数,并将这些函数的申明放在了头文件<cstring>中。

Visual C++中whar_t和char是两种不同的数据类型,它们的存储结构和使用方法都不一样。见如下例子。

#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{
	char* p;
	wchar_t s[]=L"ABC";
	char name[]="张三";
	wchar_t wname[]=L"张三";

	cout<<sizeof(wchar_t)<<" "; //输出2
	cout<<sizeof(s)<<endl;   //输出8

	p=(char*)s;
	for(int i=0;i<sizeof(s);++i)
		cout<<(int)p[i]<<" ";
	cout<<endl;

	cout<<s<<" ";
	wcout<<s<<endl;

	for(int i=0;i<sizeof(name);++i)
		cout<<(int)name[i]<<" ";
	cout<<endl;
	p=(char*)wname;
	for(int i=0;i<sizeof(wname);++i)
		cout<<(int)p[i]<<" ";
	cout<<endl;

	cout<<name<<endl;
	//setlocale(LC_ALL, "chs"); //加上此句下面的wname才会输出
	wcout<<wname<<endl;
}

程序输出结果:

2 8
65 0 66 0 67 0 0 0
0048FC0C ABC
-43 -59 -56 -3 0
32 95 9 78 0 0
张三

阅读以上程序,得出如下结论:

(1)wchar_t和char是不同的数据类型,数据宽度也不一样,sizeof(char)==1,wchar_t的数据宽度与编译器的实现有关,再根据当前系统语言环境进行编码转换,足以保证存储Unicode字符,在Visual C++中 wchar_t占用两个字节。

(2)定义一个wchar_t类型的字符串时,要以L开头,否则出现编译错误。定义一个wchar_t类型的字符常量,也需要以L开头,例如wchar_t wc=L'A',如果去掉L,编译器会自动执行由char到wchar_t的转换。

(3)对于西文字符(如'A'、‘B'、'C'等)来说,在wchar_t类型的变量中,高字节存放的是0x00,低字节存放的是西文字符的ASCII码值。

(4)char类型的字符串以单字节'\0'结束,wchar_t类型的字符串以双字节'\0\0'结束。

(5)Windows7中文简体环境中一个汉字占用两个字节,采用的是GBK 编码,所以char类型的字符串中一个汉字占用两个字节表示,这两个字节的最高位都是1,只有这样,才能将它们与西文字符区别开来,所以将它们的ASCII码输出时得到两个负数。在wchar_t类型的字符串中,每个汉字都用双字节表示,采用的是UTF-16编码方式,因此相同的中文字符,存储的码值是不同的。UTF-16编码与ASCII编码不兼容,所以上面的代码中用cout输出L"ABC"无法正常输出。还有就是UTF-16编码将常用的字符采用两个字节进行存储,不常用的汉字采用四个字节存储,因此用wchar_t存储UTF-16编码中四个字节的汉字会产生数据丢失,无法正确存储。

(6)在上面的程序中,语句cout<<name<<endl;的输出结果是"张三",而语句wcout< <wname< <endl;却无法正常看到输出。如果字符串wname中全是西文字符,则仍然可以看到输出,这是在控制台程序中的一个现象,与控制台的缺省语言环境的设置有关,即设置采用什么编码方式输出。通过setlocale来设置语言环境后,进行编码转换,见程序中的代码。

以上就是浅析C++ 数据类型的详细内容,更多关于C++ 数据类型的资料请关注脚本之家其它相关文章!

相关文章

  • 将CString字符串输入转化成整数的实现方法

    将CString字符串输入转化成整数的实现方法

    下面小编就为大家带来一篇将CString字符串输入转化成整数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • 关于C++使用std::chrono获取当前秒级/毫秒级/微秒级/纳秒级时间戳问题

    关于C++使用std::chrono获取当前秒级/毫秒级/微秒级/纳秒级时间戳问题

    这篇文章主要介绍了C++使用std::chrono获取当前秒级/毫秒级/微秒级/纳秒级时间戳,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • c调用python调试方法

    c调用python调试方法

    在本文里我们给大家分享了C中调用python调试的方法和相关知识点,需要的朋友们参考下。
    2019-02-02
  • C++ qsort函数排序与冒泡模拟实现流程详解

    C++ qsort函数排序与冒泡模拟实现流程详解

    qsort是一个库函数,基于快速排序算法实现的一个排序的函数,下面这篇文章主要给大家介绍了关于C语言qsort()函数使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • 一文带你探索C++中类型转换的奥秘

    一文带你探索C++中类型转换的奥秘

    C++ 提供了四种类型转换方式,帮助我们在不同数据类型之间进行有效的数据传递和操作,这些类型转换方式在不同的场景下有各自的优势和适用性,下面我们就来深入了解一下吧
    2023-10-10
  • C++/Php/Python 语言执行shell命令的方法(推荐)

    C++/Php/Python 语言执行shell命令的方法(推荐)

    下面小编就为大家带来一篇C++/Php/Python 语言执行shell命令的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • C++取得本机IP的方法

    C++取得本机IP的方法

    这篇文章主要介绍了C++取得本机IP的方法,代码简单功能实用,具有不错的借鉴参考价值,需要的朋友可以参考下
    2014-10-10
  • 基于Qt实现日志打印系统

    基于Qt实现日志打印系统

    这篇文章主要为大家详细介绍了如何利用Qt开发一个日志打印系统,可以实现打印日志按日期、大小保存,过期删除,窗口实时显示日志,网络传输日志远程调试,需要的可以参考下
    2023-12-12
  • 递归法求最大公约数和最小公倍数的实现代码

    递归法求最大公约数和最小公倍数的实现代码

    今天整理了一下用递归法求最大公约数(gcd)和最小公倍数(lcm)。主要的工作是求最大公约数。数学上可以用辗转法求最大公约数
    2013-05-05
  • Win10下最新版CLion(2020.1.3)安装及环境配置教程详解

    Win10下最新版CLion(2020.1.3)安装及环境配置教程详解

    这篇文章主要介绍了Win10下最新版CLion(2020.1.3)安装及环境配置,CLion 是 JetBrains 推出的全新的 C/C++ 跨平台集成开发环境,本文给大家介绍的非常详细,需要的朋友可以参考下
    2020-08-08

最新评论