浅析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++ 数据类型的资料请关注我们其它相关文章!

(0)

相关推荐

  • C++学习小结之数据类型及转换方式

    一.输入输出语句 Console.ReadLine(); 会等待直到用户按下回车,一次读入一行 Console.ReadKey(); 则是等待用户按下任意键,一次读入一个字符. 二.数据类型 主要掌握: 1.值类型:int 整型,float 浮点型(单精度), double 双精度,char 字符型,bool 布尔型(两种状态true与false),datetime  日期时间 2.引用类型:string 字符串类型 问题? a.字符串与字符的区别:string类型使用 "",char

  • C++中指针的数据类型和运算相关知识小结

    C++有关指针的数据类型和指针运算的小结 前面已用过一些指针运算(如p++,p+i等),现在把全部的指针运算列出如下. 1) 指针变量加/减 一个整数 例如:p++,p--,p+i,p-i,p+-i,p-=i等. C++规定,一个指针变量加/减一个整数是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数相加或相减.如p+i代表这样的地址计算:p+i*d,d为p所指向的变量单元所占用的字节数.这样才能保证p+i指向p下面的第i个元素. 2) 指针变量赋值 将一个变量地址赋给一个指

  • 深入讲解C++数据类型转换的相关函数的知识

    C++数据类型转换以及转换构造函数 标准数据类型之间的转换 在C++中,某些不同类型数据之间可以自动转换,例如 int i = 6; i = 7.5 + i; 编译系统对 7.5是作为double型数处理的,在求解表达式时,先将6转换成double型,然后与7.5相加,得到和为13.5,在向整型变量i赋值时,将13.5转换为整数13,然后赋给i.这种转换是由C++编译系统自动完成的,用户不需干预.这种转换称为隐式类型转换. C++还提供显式类型转换,程序人员在程序中指定将一种指定的数据转换成另一

  • C++利用stringstream进行数据类型转换实例

    本文实例讲述了C++利用stringstream进行数据类型转换的方法.分享给大家供大家参考.具体分析如下: 在C++标准库里面,使用stringstream 可以用于各种数据类型之间的转换 例如string 转 int 复制代码 代码如下: std::string strId = "1";  int id = 0;  std::stringstream ss;  ss << strId.c_str();  ss >> id; 希望本文所述对大家的C++程序设计

  • C和C++中的基本数据类型的大小及表示范围详解

    本文研究的主要问题时关于C和C++中的基本数据类型int.long.long long.float.double.char.string的大小及表示范围,具体介绍如下. 一.基本类型的大小及范围的总结(以下所讲都是默认在32位操作系统下): 字节:byte:位:bit. 1.短整型short:所占内存大小:2byte=16bit: 所能表示范围:-32768~32767:(即-2^15~2^15-1) 2.整型int:所占内存大小:4byte=32bit: 所能表示范围:-2147483648~

  • Visual C++ 常用数据类型转换方法详解第1/2页

    说明:本文纯粹是总结一下有关类型转换的贴子, 本人并未对所有方法都做测试,仅仅是为了给大家一个参考. 读者层次:初学 int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username[]="程佩君"; char temp[200]; char *buf; CString str; _variant_t v1; _bstr_t v2; 一.其它数据类型转换为字符串 短整型(int) itoa(i,te

  • C++编程中的数据类型和常量学习教程

    C++数据类型 计算机处理的对象是数据,而数据是以某种特定的形式存在的(例如整数.浮点数.字符等形式).不同的数据之间往往还存在某些联系(例如由若干个整数组成一个整数数组).数据结构指的是数据的组织形式.例如,数组就是一种数据结构.不同的计算机语言所允许使用的数据结构是不同的.处理同一类问题,如果数据结构不同,算法也会不同.例如,对10个整数排序和对包含10个元素的整型数组排序的算法是不同的. C++的数据包括常量与变量,常量与变量都具有类型.由以上这些数据类型还可以构成更复杂的数据结构.例如利

  • 解决易语言转换到C++ 自定义数据类型

    自定义数据类型如下 .版本 2 .数据类型 数据 .成员 坐标, 坐标_数据类型 .数据类型 坐标_数据类型 .成员 x, 小数型 .成员 z, 小数型 .成员 y, 小数型 这里的自定义数据类型下的"数据"类型下的"坐标"成员引用自定义数据类型"坐标_数据类型" 子程序如下 .版本 2 .子程序 自己数据 .参数 返回数据, 数据, 参考 返回数据.坐标.x = 1 返回数据.坐标.z = 2 返回数据.坐标.y = 3 这里的子程序内的参数&

  • java和c/c++ 数据类型长度的比较

    1. c语言中的整数类型有char, short, int, long等几种, 下面是C语言对每种数据类型长度的规定: (a). short和long类型的长度不相同 (b). int类型通常同具体机器的物理字长相同 (c). short通常是16bits, int通常是16bits or 32bits每种编译器可以根据硬件的不同自由确定, 但是short和int必须最少是16bits, 而long类型必须最少是32bits, 并且short必须比int和long类型要短. 2. sizeof(

  • C/C++与Java各数据类型所占字节数的详细比较

    C/C++的数据类型: 一,整型 Turbo C:   [signed] int 2Byte//有符号数,-32768~32767   unsigned int 2Byte //无符号数,只能表示整数0~65535 [signed] short [int] 2Byte unsigned short [int] 2 Byte long [int] 4 Byte unsigned long [int] 4 Byte Visual C++ 6.0: [signed] int 4Byte   unsig

  • 浅谈C++的语句语法与强制数据类型转换

    一个程序包含一个或多个程序单位(每个程序单位构成一个程序文件).每一个程序单位由以下几个部分组成: 预处理命令.如#include命令和#define命令. 声明部分.例如对数据类型和函数的声明,以及对变量的定义. 函数.包括函数首部和函数体,在函数体中可以包含若干声明语句和执行语句. 如下面是一个完整的C++程序: #include <iostream>//预处理命令 using namespace std; //在函数之外的声明部分 int a=3; //在函数之外的声明部分 int ma

随机推荐