摘要:
此文系《专题: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;//使用命名空间std
int 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: " << "************size**************" << endl;
cout << "short: " << "字节数:" << sizeof(short) << endl;
cout << "最大值:" << (numeric_limits<short>::max)();
cout << " 最小值:" << (numeric_limits<short>::min)() << endl;
cout << "int: " << "字节数:" << sizeof(int) << endl;
cout << "最大值:" << (numeric_limits<int>::max)();
cout << " 最小值:" << (numeric_limits<int>::min)() << endl;
cout << "unsigned: " << "字节数:" << sizeof(unsigned) << endl;
cout << "最大值:" << (numeric_limits<unsigned>::max)();
cout << " 最小值:" << (numeric_limits<unsigned>::min)() << endl;
cout << "long: " << "字节数:" << sizeof(long) << endl;
cout << "最大值:" << (numeric_limits<long>::max)();
cout << " 最小值:" << (numeric_limits<long>::min)() << endl;
cout << "unsigned long: " << "字节数:" << sizeof(unsigned long) << endl;
cout << "最大值:" << (numeric_limits<unsigned long>::max)();
cout << " 最小值:" << (numeric_limits<unsigned long>::min)() << endl;
cout << "long long: " << "字节数:" << sizeof(long long) << endl;
cout << "最大值:" << (numeric_limits<long long>::max)();
cout << " 最小值:" << (numeric_limits<long long>::min)() << endl;
cout << "unsigned long long: " << "字节数:" << sizeof(unsigned long long) << endl;
cout << "最大值:" << (numeric_limits<unsigned long long>::max)();
cout << " 最小值:" << (numeric_limits<unsigned long long>::min)() << endl;
cout << "double: " << "字节数:" << sizeof(double) << endl;
cout << "最大值:" << (numeric_limits<double>::max)();
cout << " 最小值:" << (numeric_limits<double>::min)() << endl;
cout << "long double: " << "字节数:" << sizeof(long double) << endl;
cout << "最大值:" << (numeric_limits<long double>::max)();
cout << " 最小值:" << (numeric_limits<long double>::min)() << endl;
cout << "float: " << "字节数:" << sizeof(float) << endl;
cout << "最大值:" << (numeric_limits<float>::max)();
cout << " 最小值:" << (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多个,多出来的这些编码被计算机用来作为控制,称为“非打印字符”。这些字符通过转义序列的方式进行输入和打印。
转义字符的定义,可参考:
转义字符
在此举一个例子,如换行转义字符
:
当执行:cout<<"Hello
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++中的五种内置数据类型(整型、实型、字符型、布尔型、枚举型)和他们各自的表示,内存占用及其使用注意事项。