《专题:C++语法基础》篇二:C++中的数据类型

来源:互联网 发布:酷狗音乐mac版下载 编辑:程序博客网 时间:2024/06/13 06:35

摘要:

此文系《专题:C++语法基础》系列的第二篇,主要介绍了C++中的五种内置数据类型,包括:整型、实型、字符型、布尔型和枚举型。

C++处理的每一个数据都必须指明其类型。一个数据类型就是事先做好的一个工具。
C++可以处理的基本数据类型包括:整型、实型、字符型和布尔型,枚举型。当然,C++允许用户按自己的需求定义类型。
以下将详细介绍C++内置的这5种数据类型:

一、整型

顾名思义,整型变量即是用来存储整数的。一个整形变量能存储一个整数,但存储的整数并非无限大,而是取决于整形变量在计算机中所占用的内存大小。

1、整型数的内部表示及其允许的运算

整型数在计算机内一般是以补码表示的。正整数的补码是它的二进制表示,负整数的补码是将他的绝对值的二进制按位取反后再加1。例如若一个以16位表示的数字10,则在内存中表示为0000000000001010,-10则表示为1111111111110110。
在整数的补码表示中,最高位表示符号位,正数为0,负数为1。对16位表示而言,正整数表示范围为0000000000000000~0111111111111111,即0~32767。负数则为1000000000000000~1111111111111111,即-32768~-1。
对整型数可以进行的运算包括算术运算和比较运算。当然还有输入输出运算。

2、整型数的分类

C++共有6种整型数据类型,其占用字节和表示范围如下:

类型 类型名 在VS中占用空间大小 表示范围 基本整型 int 4字节 -2^31~2^31−1 短整型 short(int) 2字节 -2^15~2^15−1 长整型 long(int) 4字节 -2^31~2^31−1 无符号基本整型 unsigned(int) 4字节 0~2^32−1 无符号短整型 unsigned short(int) 2字节 0~2^16−1 无符号长整型 unsigned long(int) 4字节 0~2^32−1

例子:
两个整型数的相加

/***第2个程序:AddTwoNumber*功能:两个整型数的相加求结果**@version2016.12.21*@author zha yongchun*/#include<iostream>//预编译指令using namespace std;//使用命名空间stdint main(){//主函数    int a=10;//定义a并赋值10    int b = 20;//定义b并赋值20    int c ;//定义c但不赋值    c = a + b;//对a,b进行加法运算并将结果保存在c中    cout << "a+b="<<c<<endl;//输出    system("pause");    return 0;}

3、整型数据的溢出

在整型数的内部表示中,正整数的最高位为0,负正数的最高位为1。设想一个16位的整型数,其能表示的最大值为32726,若此时对该值进行加1操作,则内部的补码将由01111111111111111变为1000000000000000,由于最高位是1,C++会把这个数解释为-32728。这种情况就称为“溢出”。

4、整型常量

整型常量的表示包括8进制,10进制和16进制。
8进制的整型常量常以0开头,如0123,表示10进制下的83。
16进制以0x开头,如0x123,其表示10进制下的291。
整型常量默认为int型的,如需指定其类型,则可在数字末尾添加L(long)或U(unsigned)。

二、实型

实数在计算机内常以浮点数表示,因而实型又称浮点型。

1、实型数的内部表示及其支持的运算

实型数在计算机内部通常表示为a*2^b,a称为尾数,b称为指数,这种形式称为浮点表示法。a表征了数的储存精度,b表征了数的大小。
实型数可支持的运算包括算术运算和比较运算。也包括输入输出运算。

2、实型数的分类

C++中实型数分为三种类型,分别为:单精度(float)、双精度(double)和长双精度(long double)。

名称 符号 占用内存 a占位数 b占位数 表示范围 单精度 float 4 3 1 2^(−128)~2^127 双精度 double 8 5 3 长双精度 long double 8 5 3

例子:求C++中基本数据类型占用的字节数和表示范围

/******求C++数据类型中的字节长度和数据范围*@version20161223*@mail1729465178@qq.com*****/#include<iostream>#include<string>#include <limits>using namespace std;int main(){    cout << "type: \t\t\t" << "************size**************" << endl;    cout << "short: \t\t\t" << "字节数:" << sizeof(short) << endl;    cout << "最大值:" << (numeric_limits<short>::max)();    cout << "\t\t最小值:" << (numeric_limits<short>::min)() << endl;    cout << "int: \t\t\t" << "字节数:" << sizeof(int) << endl;    cout << "最大值:" << (numeric_limits<int>::max)();    cout << "\t最小值:" << (numeric_limits<int>::min)() << endl;    cout << "unsigned: \t\t" << "字节数:" << sizeof(unsigned) << endl;    cout << "最大值:" << (numeric_limits<unsigned>::max)();    cout << "\t最小值:" << (numeric_limits<unsigned>::min)() << endl;    cout << "long: \t\t\t" << "字节数:" << sizeof(long) << endl;    cout << "最大值:" << (numeric_limits<long>::max)();    cout << "\t最小值:" << (numeric_limits<long>::min)() << endl;    cout << "unsigned long: \t\t" << "字节数:" << sizeof(unsigned long) << endl;    cout << "最大值:" << (numeric_limits<unsigned long>::max)();    cout << "\t最小值:" << (numeric_limits<unsigned long>::min)() << endl;    cout << "long long: \t\t" << "字节数:" << sizeof(long long) << endl;    cout << "最大值:" << (numeric_limits<long long>::max)();    cout << "\t\t最小值:" << (numeric_limits<long long>::min)() << endl;    cout << "unsigned long long: \t" << "字节数:" << sizeof(unsigned long long) << endl;    cout << "最大值:" << (numeric_limits<unsigned long long>::max)();    cout << "\t\t最小值:" << (numeric_limits<unsigned long long>::min)() << endl;    cout << "double: \t\t" << "字节数:" << sizeof(double) << endl;    cout << "最大值:" << (numeric_limits<double>::max)();    cout << "\t最小值:" << (numeric_limits<double>::min)() << endl;    cout << "long double: \t\t" << "字节数:" << sizeof(long double) << endl;    cout << "最大值:" << (numeric_limits<long double>::max)();    cout << "\t最小值:" << (numeric_limits<long double>::min)() << endl;    cout << "float: \t\t\t" << "字节数:" << sizeof(float) << endl;    cout << "最大值:" << (numeric_limits<float>::max)();    cout << "\t最小值:" << (numeric_limits<float>::min)() << endl;    system("pause");    return 0;}

3、实型常量的表示

实型常量可表示为十进制小数(如123.4,234.0等)或者科学记数法(如1.234*e2)
注意,使用底数e代表10,比如〖10〗^2 表示为1e2,前面的1不可省略。

三、字符型

1、字符型数据的内部表示

字符在计算机内部用一个编号表示。编号采用ASCII标准。
关于ASCII标准对照表,可参考:
ASCII码对照表
在C++中使用char表示字符类型。其占用一个字节的内存。

2、字符运算

字符能执行比较、算术运算和输入输出。运算时计算机提取字符对应的ASCII码值参与计算。
如执行可执行‘A’+‘B’,计算机会找出A的码值65和B的码值66进行相加。

3、字符常量的表示

C++的字符常量是用单引号括起来的一个字符。如‘S’,‘1’,‘?’。这些字符称为可打印字符。
ASCII码编码的长度为8位,但实际可打印的字符通常只有100多个,多出来的这些编码被计算机用来作为控制,称为“非打印字符”。这些字符通过转义序列的方式进行输入和打印。
转义字符的定义,可参考:
转义字符

在此举一个例子,如换行转义字符\n:
当执行:cout<<"Hello\n world";
此时控制台的输出为两行:
Hello
World

四、布尔型

布尔型用于表示“真”或”假“这样的逻辑值。C++中使用bool作为布尔型关键字,它有两个值,分别为true和false。在VS中布尔型数据占用一个字节的内存。true表示逻辑真,在内存中值为1,false表示逻辑假,在内存中表示为0。

五、枚举类型

枚举类型可用来表示取值仅为有限的数据,比如一周中的七天。枚举类型的关键字为enum,定义枚举类型采用格式 enum 枚举类型名{元素表},例如定义一周可采用 enum Weekday{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday},此时定义了一个取值仅为7个有效值的的枚举类型,在内部表示中,将从0开始为枚举类型的元素赋值,如上面的定义中,Sunday值为0,Saturday值为0。当然,你也可以自己某元素指定值,如你可以这样操作enum Weekday{Sunday=1,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday}。
当定义了枚举类型后便可以定义枚举类型的变量:
如 enum Weekday w1,此时w1即为枚举类型变量,其可取值为上面所定义的7个值。
或者也可以这样定义:
Weekday w2。这个定义和上面的定义是完全相同的。
对于枚举类型的变量,可进行的运算包括赋值和比较,比如对上面定义的w1,w2,可以执行w1=Sunday,w2=Monday,w1>w2,实际上在内部运算时,计算使用的是变量对应的ASCII码值。

六、其它一些实用的小技巧

1、用typedef重新命名类型名

使用typedef可以为C++内置的类型重新指定一个名称,如:
typeof int INT,此时INT便具有int一样的功能。
此时你可以这样定义变量: int a;
也可以用你自定义的类型来定义: INT a;

2、变量的初始化

在C++中,定义变量只是为变量分配了存储空间,但是并没有为其指定值,此时你可以自己指定初值,比如int a=12;此时即表示定义了一个int型的变量a并且把12赋给a,此时a的值便是12。若定义时没有为变量指定初值,则C++会为其随机赋值。

3、用sizeof()了解内存占用量

sizeof()运算可以求解出C++内部数据类型的内存占用量,比如sizeof(int)可以得到int型的内存占用大小。

4、符号常量

符号常量即使用变量来代替某个具体的值,但是这个变量的值是不可更改的。比如要表示3.14159,每次使用都输入这样一个值是极其不方便变的,此时你可以定一个常量pi来表示该值,符号常量的定义格式为:const <类型名> <常量名> =<值>
比如定义const pi=3.14159。注意:符号常量必须在定义时为其指定初值,一旦定义其值便不可在程序中更改。

七、小结

本篇文章主要介绍了C++中的五种内置数据类型(整型、实型、字符型、布尔型、枚举型)和他们各自的表示,内存占用及其使用注意事项。

1 0