C++中的数据处理,包含以下内容:
1、C++变量的命名规则。
2、C++内置的整型——unsigned long、long、unsigned int、int、unsigned short、short、char、unsigned char、signed char、bool。
3、表示各种整型的系统限制的climits文件。
4、各种整型的数字字面值(常量)。
5、使用const限制符来创建符号常量。
6、C++内置的浮点类型:float、double和long double。
7、表示各种浮点类型的系统限制的cfloat文件。
8、各种浮点类型的数字字面值。
9、C++的算术运算符。
10、自动类型转换和强制类型转换。
一、简单变量
1.1变量名
必须遵循几种简单的C++命名规则:
(1)在名称中只能只用字母字符、数字和下划线。
(2)名称的第一个字符不能是数字。
(3)区分大小写。
(4)不能将关键字用作名称。
(5)以两个下划线或下划线和大写字母打头的名称被保留给实现使用,以一个下划线开头的名称被保留给实现,用作全局标识符。
(6)C++对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制。
倒数第二点与前面几点有些不同,因为使用像_time_stop或_Dount这样的名称不会导致编译器错误,而会导致行为的不确定性。换句话说就是不知道结果将会是什么。不出现编译器错误的原因是,这样的名称不是非法的,但要留给实现使用。
1.2整型
不同的C++整型使用不同的内存量来存储整数,可用术语宽度来描述,内存用到的越多,则越宽。C++的基本整型按宽度递增可分为char、short、int、long和C++11新增的long
long,其中每种类型都有符号版本和无符号版本,共有10种类型可供选择。
计算机内存由一些叫做位(bit)的单元组成。如果在所有系统中,每种类型的宽度都相同,那么使用起来会非常方便。但是生活并不是这么简单的,因此C++提供了一种灵活的标准,它确保了最小长度:
(1)short至少16位。
(2)int至少与short一样长。
(3)long至少32位,且至少与int一样长。
(4)Long long至少64位,且至少与long一样长。
当前很多系统都使用最小长度,即short为16位,long为32位。这仍然为int提供了多种选择,其宽度可以是16位、24位或者32位,同时又符合标准;甚至可以是64位,因为long和long long至少长64位。
有些实现允许选择如何处理int。类型的宽度随实现而异,这可能在将C++程序从一种环境移到另一种环境时引发问题(包括在同一系统中使用不同的编译器)。
要知道系统中整数的最大长度,可以在程序中使用C++工具来检查类型的长度。首先sizeof运算符返回类型或变量的长度,单位为字节,其使用方法是将类型名放到其后的括号中,如下:sizeof(int)。但是“字节”的含义依赖于实现,因此在一个系统中,两字节的int可能是16位,而在另一个系统中可能是32位。其次,头文件climits中包含了关于整型限制的信息,具体的说,它定义了表示各种限制的符号名称,即其定义了符号常量来表示类型的限制。
climits中的符号常量见表https://blog.csdn.net/lvdezhou/article/details/48806831
1.3无符号类型
前面介绍的4种整型都有一种不能存储负数值的无符号变体,其优点是可以增大变量能够存储的最大值。当然,仅当数值不会为负时才应使用无符号类型。要创建无符号版本的基本整型,只需要使用关键字unsigned来修改声明即可。注意unsigned本身是unsigned int的缩写。整型变量的行为就像里程表,如果超越了限制,其值将为范围另一端的取值。C++确保了无符号类型的这种行为,但并不保证符号整型超越限制(上溢和下溢)时不错误,而这正是当前实现种最常见的行为。
1.4选择整型类型
int被设置为对目标计算机而言最为“自然”的长度。自然长度指的是计算机处理起来效率最高的长度。如果没有非常有说服力的理由来选择其他类型,则应该使用int。如果知道变量可能表示的整数大于16位整数的最大可能值,则使用long。即使系统上int为32位,也应该这么做。这样,将程序移植到16位系统时,就不会突然无法正常工作。如果要存储的值超过20亿,可使用long long。
如果short比int小,则使用short可以节省内存。通常,仅当有大型整型数组时,才有必要使用short。如果节省内存很重要,则应使用short而不是使用int,即使它们的长度是一样的。
1.5整型字面值
整型字面值(常量)是显式书写的常量,如212或176。与C相同,C++能够以三种不同的计数方式来书写整数:基数为10,即第一位为1-9,也称为十进制;基数为8,第一位为0,第二位位1-7,也称为八进制;基数为16,前两位为0x或0X,也称为十六进制。对于十六进制数,字符a-f和A-F表示了十六进制位,对应于10-15。
在默认情况下,cout以十进制格式显示整数,而不管这些整数在程序中式如何书写的。
但像头文件iostream提供了控制符endl,用于指示cout重起一行一样,它还提供了dec、hex和oct,分别用于指示cout以十进制、十六进制和八进制显示整数。
这些表示方式仅仅是为了表达上的方便,且都能以相同的方式存储在计算机中—被存
储为二进制数。
1.6 char类型:字符和小整数
编程语言通过使用字母的数值来进行字母的存储,所以char类型是另一种整型。它足够长,能够表示目标计算机系统中的所有基本符号——所有的字母、数字、标点符号等。实际上,很多系统支持的字符否不超过128个,因此用一个字节就可以表示所有的符号。因此,虽然char最常被用来处理字符,但也可以将它用作比short更小的整型。
在美国最常用的是ASCII字符集。字符集中的字符用数值编码表示。
因为char为整型,所有可以对其使用整数操作,如加1。这使得C++将字符表示为整数提供了方便,使得操作字符值很容易。不必使用笨重的转换函数在字符和ASCII码之间来回转换。
Cout.put()是一个类ostream的成员函数,用来输出字符,只有通过类的特定对象来使用成员函数,其中句点称为成员运算符。Cout.put()成员函数提供了另一种显示字符的方法,可以替代<<运算符。可能会有人问,为何需要Cout.put()。答案与历史有关。在C++的Release2.0之前,cout将字符变量显示为字符,而将字符常量显示为数字。问题是,C++早期版本与C一样,也将字符常量存储为int类型。也就是说,’M’的编码77将被存储在一个16位或者32位的单元中,而char变量一般占8位。
下面的语句从常量‘M’中复制8位到变量ch中:
Char ch=‘M’;
遗憾的是,这意味着对cout来说,‘M’和ch有天壤之别,虽然它们存储的值相同。因此下面语句将打印:
Cout<<‘$’;
而下面语句就打印字符$:
Cout.put(‘$’);
在Release2.0之后,C++字符常量存储为char类型,而不是int类型,这意味着cout现在可以正确处理字符常量了。
1.7signed char 和unsigned char
与int不同的是,char在默认情况下既不是没有符号,也不是有符号,是否有符号由C++实现决定,这样编译开发人员可以最大限度地将这种类型与硬件属性匹配起来。如果将char用作数值类型,则unsigned char和signed char之间的差异将非常重要。unsigned char类型的表示范围在0-255,而signed char的表示范围在-128-127.另一方面,如果使用char变量来存储标准的ASCII字符,则char有没有字符都没有关系,在这种情况下,可以使用char。
1.8 wcha_t
程序需要处理的字符集可能无法用一个8位的字节来表示,如日文汉字系统。Wcha_t类型是宽字符类型,可以表示扩展字符集。
1.9bool类型
C++将非零值解释为true,将零解释为false。现在可以使用bool类型来表示真和假了,它们分别用预定义的字面值true和false表示,也就是说,可以这样编写语句:
Bool is_ready=true;
字面值true和false都可以通过提升转换为int类型,true被转换为1,而false被转换为0:
Int ans=true;
Int promise=false;
另外,任何数字值或指针值都可以被隐式转换为bool值。任何非零值都被转换为true,而零被转换为false:
Bool start=-100;
Bool stop=0;
二、const限定符
C++有一种更好的处理符号常量的方法,这种方法就是使用const关键字来修改变量声明和初始化。假如需要一个表示一年中月份数的符号常量,则可写为:
Const int Months=12;
常量Months被初始化后,其值就固定了,编译器将不允许在修改该常量的值。
一种常见的做法是将名称的首字母大写,以提醒你Months是一个常量。另一种约定是将整个名称大写,使用#define创建常量时通常使用这种约定。还有一种约定是以字母k打头,如kmonths。
创建常量的通用格式:
Const type name=value;
相比#define,const更好,首先它能够明确指定类型,其次可以使用C++的作用域规则将定义限制在特定的函数或者文件中,其中作用域规则描述了名称在各种模块中的可知程度。第三,可以将const用于更加复杂的类型,如数组和结构。
三、浮点数
C++有3种浮点类型:float、double和long double。通常,float为32位,double为64位,long double为80、96或128位,另外,这3种类型的指数范围至少是-37到37。
调用ostream类的setf()方法,这种调用迫使输出使用定点法,以便更好地了解精度,它防止程序将较大的值切换为E表示法,并使程序显示到小数点后6位。
浮点常量在默认情况下为double类型。
四、C++算术运算符
%运算符求模。要求两个操作数必须都是整型,将该运算符用于浮点数将导致编译错误。如果其中一个是负数,则结果的符号满足如下规则:(a/b)*b+a%b=a。
4.1类型转换
C++自动执行很多类型转换:
1、将一种算术类型的值赋给另一种算术类型的变量时,C++将对其值进行转换。
2、表达式种包含不同的类型时,C++将对值进行转换。
3、将参数传递给函数时,C++对值进行转换。
(1)初始化和赋值进行的转换
(2)以{}方式初始化时进行的转换(C++11)
(3)表达式中的转换
遵循以下规则:
1、如果有一个操作数的类型是long double,则将另一个操作数转换为long double。
2、否则,如果有一个操作数的类型是double,则将另一个操作数转换为double。
3、否则,如果有一个操作数的类型是float,则将另一个操作数转换为float。
4、否则,说明操作数都是整型,因此执行整型提升。
5、在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。
6、如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的界别比有符号操作数的级别高,则将有符号的操作数转换为无符号操作数所属的类型。
7、否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。
8、否则,将两个操作数都转换为有符号类型的无符号版本。
对于整型级别来说,有符号整型按照级别从高到低依次为:long long、long、int、short和signed char。无符号整型的排列顺序与有符号整型相同。类型char、signed char和unsigned char的级别相同。类型bool的级别最低。
(4)传递参数时的转换
(5)强制类型转换
强制类型转换的格式:(typeName) value或typeName (value)。第一种来自C语言,第二种格式的C++。
五、总结
1、C++的基本类型分为两组:一组由存储为整数的值组成,另一组由存储为浮点格式的值组成。整型之间通过存储值时使用的内存量及有无符号来区分。整型从最小到最大依次为:bool、char、signed char、unsigned char、short、unsigned short、int、unsigned int、long、unsigned lon以及C++11新增的long long和unsigned long long。
2、浮点类型可以表示小数值以及比整型能够表示的值大得多的值。
————————————————
版权声明:本文为CSDN博主「好学的小李」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zjnldxshsj/article/details/80633071