3.1.7 C++如何确定常量的类型
程序的声明将特定的整型变量的类型告诉了C++编译器,但编译器如何知道常量的类型呢?假设在程序中使用常量表示一个数字:
cout<<”Year = ”<<1492<<”\n”
程序将把1492存储为int、long还是其他整型呢?答案是,除非有理由存储为其他类型(如使用特殊的后缀来表示特定的类型,或者值太大,不能存储为int),否则C++将整型常量存储为int类型。
首先来看看后缀。后缀是放在数字常量后面的字母,用于表示类型。整数后面的l或L后缀表示该整数位long常量,u或U后缀表示unsigned int常量,ul(可以采用任何一种顺序,大写小写均可)表示unsigned long常量(由于小写l看上去很像数字1,因此应使用大写L做后缀)。例如,在int为16位、long为32位的系统上,数字22022被存储为int,占16位,数字22022L被存储位long,占32位。同样,22022LU和22022UL都被存储位unsigned long。C++11提供了用于表示类型long long的后缀ll或LL,还提供了用于表示类型unsigned long long的后缀ull、Ull、uLL、ULL。
接下来考察长度。C++中,对十进制整数采用的规则,与十六进制和八进制稍微有些不同。对于不带后缀的十进制整数,将使用下面几种类型中能够存储概述的最小类型来表示:int、long或long long,3000000000被表示为long long类型。对于不带后缀的十六进制或八进制,将使用下面几种类型中能够存储该数最小类型来表示:int、unsigned int、long、unsigned long、long long 、或unsigned long long 。在将40000表示为long的计算机系统中,十六进制数0x9C40(40000)将被表示为unsigned int。这是因为十六进制常用来表示内存地址,而内存地址是没有符号的,因此unsigned int 比long 更适合用来表示16位的地址。
2.1.8 char 类型:字符和小整数
下面介绍最后一种整型:char类型。顾名思义,char类型是专门存储字符(如字母和数字)而设计的。现在,存储数字对于计算机来说算不了什么,但存储字母则是另一回事。编程语言通过使用字母的数值编码解决了这个问题。因此,char类型是另一种整型。它足够长,能够表示目标计算机系统中所有基本符号——所有字母、数字、标点符号等。实际上,很多系统支持的字符都不超过128个,因此用一个字节就可以表示所有的符号。因此,虽然char最常被用来处理字符,但也可以用它用作比short更小的整型。
在美国,最常用的符号集是ASCII字符集。字符集中的字符用数值编码(ASCII码)表示。
例如,字符A的编码为65,字母M的编码为77。为方便起见,我们在示例中使用的是ASCII码。然而,C++实现使用的是其主机系统的编码——例如,IBM大型机使用EBCDIC编码。ASCII和EBCDIC都不能很好的满足国际需要,C++支持的宽字符类型可以存储更多的值,如国际Unicode字符集使用的值。本章稍后将介绍wchar_t类型。
//chartype.cpp——the char type
#include<iostream>
using namespace std;
int main()
{
char ch;
cout<<"Enter a character:"<<endl;
cin>>ch;
cout<<"Hola ! ";
cout<<"Thank you for the "<<ch<<" character."<<endl;
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/a05e165e5378bf5e8c46a5935031d584.png)
有趣的是,程序中输入的是M,而不是对应的字符编码77。另外,程序将打印M,而不是77。通过查看内存可以知道,77是内存在变量ch中的值,这种神奇的力量不是来自char类型,而是来自cin和cout这些工具为您完成了转换工作,输入是,cin将键盘输入的M转换为77;输出时,cout将值77转换为所显示的字符M;cin和cout的行为都是由变量类型引导的。如果将77存储在int变量中,则cout将把它显示为77(也就是说,cout显示两个字符7)。程序3.6说明了这一点,该程序还演示了如何在C++中书写字符字面值;将字符用单引号括起,如’M’(注意,示例中没有使用双引号。C++对字符用单引号,对字符串使用双引号。cout对象能够处理这两种情况,但正如第四章将讨论的,这两者有天壤之别)。最好,程序引入了cout的一项特性——cout.put()函数,该函数显示一个字符。
程序3.6 morechar.cpp
//morechat.cpp——the char type and int type contrasted
#include<iostream>
using namespace std;
int main()
{
char ch='M';
int i=ch;
cout<<"The ASCII code for "<<ch<<" is"<<i<<endl;
cout<<"Add one to the character code:"<<endl;
ch=ch+1;
i=ch;
cout<<"The ASCII code for "<<ch<<" is"<<i<<endl;
cout<<"Displaying char ch using cout.put(ch)";
cout.put(ch);
cout.put('!');
cout<<endl<<"Done"<<endl;
return 0;
}
下面是程序清单3.6中程序的输出:
![](https://i-blog.csdnimg.cn/blog_migrate/383368825ef0b6f8bf64d7d2a2640e14.png)
1. 程序说明
在程序3.6中,’M’表示字符M的数值编码,因此将char变量ch初始化为’M’,将把c设置为77。然后,程序将同样的值赋给int变量i,这样ch和i的值都是77.接下来,cout把ch显示为M,而把i显示为77。如前所述,值得类型将引导cout选择如何显示值——这是智能对象的另一个例子。
由于ch实际上是一个整数,因此可以对它使用整数操作,如加1,这将把ch的值变为78。然后,程序将i重新设置为新的值(也可以将i加1)。cout再次将这个值的char版本显示为字符,将int版本显示为数字。
C++将字符表示为整数提供了方便,使得操纵字符值很容易。不必使用笨重的转换函数在字符和ASCII码之间来回转换。
即使用过键盘输入的数字也被视为字符,请看下面的代码:
char ch;
cin>>ch;
如果您输入5并按回车键,上述代码将读取字符“5”,并将其对应的字符编码(ASCII编码53)存储到变量ch中。请看下面的代码:
int n;
cin>>n;
如果您也输入5并按回车键,上述代码将读取字符“5”,将其转换为相应的数字值5,并存储到变量n中国能。
最后,该程序使用函数cout.put()显示变量ch和一个字符常量。