无符号整型
3.1.4 无符号类型
前面介绍的4中整型都有一种不能存储负数值的无符号变体,其优点是可以增大变量能够存储的最大值。例如,如果short表示的范围为-32768到+32767,则无符号版本的表示范围为0-65535。当然,仅当数值不会为负时才应使用无符号类型,如人口、粒数等。要创建无符号版本的基本整型,只需使用关键字unsigned来修改声明即可:
unsigned short change;
unsigned int rovert;
unsigned quarterback;
unsigned long gone;
unsigned long long lang_lang;
注意,unsigned本身是unsigned int的缩写。
程序3.2演示了如何使用无符号类型,并说明了程序试图超越整型的限制时将产生的后果。最后在看一看预处理语句#define。
程序3.2 exceed.cpp
下面是该程序的输出:
该程序将一个short变量(sum)和一个unsigned short变量(sue)分别设置为最大的short值,在我们的系统上,是32767.然后,将这些变量的值都加1.这对于sue来说没有什么问题,因为新值仍比无符号整数的最大值小得多;但sam的值从32767变成了-32768!同样,对于sum,将其设置为0并减去1,也不会有问题:但对于无符号变量sue,将其值设置为0并减去后,它变成了65535。可以看出,这些整型变量的行为就像里程表。如果超越了限制,其值将为范围另一端的取值。C++确保了无符号类型的这种行为,但C++并不保证符号整型超越限制(上溢和下溢)时不出错,而这正是当前实现中最常见的行为。
3.1.5 选择整型类型
C++提供了大量的整型,应使用哪种类型呢?通常,int 被设置为对目标计算机而言最为“自然”的长度,自然长度指的是计算机处理起来效率最高的长度。如果没有非常有说服力的理由来选择其他类型,则应使用int。
现在来看看可能使用其他类型的原因。
如果变量表示额度值不可能为负,如文档中的字数,则可以使用无符号类型,这样变量可以表示更大的值。
如果知道变量可能表示的整数值大于16位整数的最大可能值,则使用long。即使系统上int位32位,也应这样做。这样,将程序移植到16位系统是,就不会突然无法正常工作了。如果要存储的值超过20亿,可使用long long。
如果short比int小,则使用short可以节省内存。通常,仅当有大型整型数组是,才有必要使用short。(数组是一种数据结构,在内存中连续存储同类型的多个值。)如果节省内存很重要,则应使用short而不是使用int,即使它们的长度是一样的。例如,假设要将程序从int位16位的系统移到int位32位的系统,则用于存储int数组的内存量将加倍,但short数组不受影响。请记住,节省一点就是赢得一点。
如果只需要一个字节,可使用char,这将稍后介绍
3.1.6 整型字面值
整型字面值(常量)是显式地书写的常量,如212或1776。与C相同,C++能够以三种不同的计数方式来书写整数:基数为10、基数为8(老式UNIX版本)和基数为16(硬件黑客的最爱)。这里将介绍C++表示法。C++使用前一(两)位来表示数字常量的基数。如果第一位为1~9,则基数为10(十进制):因此93是以10为基数的。如果第一位是0,第二位为1~7.则基数为8(八进制);因此,042的基数是8;它相当于十进制34.如果前两位为0x或0X,则基数为16(十六进制);因此0x42为十六进制数,相当于十进制数66,字符a~f和A~F表示了十六进制位,对应于10~15。0xF为15,0xA5为165(十个16加5个1)。程序3.3演示了这三种基数
程序3.3 hexoct.cpp
//hexoct1.cpp——shows hex and octal literals
#include<iOStream>
int main()
{
using namespace std;
int chest = 42;
int waist = 0x42;
int inseam = 042;
cout<<"Monsieur cuts a striking figure!\n";
cout<<"chest = "<<chest<<" (42 in decimal)"<<endl;
cout<<"waist = "<<waist<<" (0x42 in hex)"<<endl;
cout<<"inseam = "<<inseam<<" (042 in octal)"<<endl;
return 0;
}
在默认情况下,cout以十进制格式显示整数,而不管这些整数在程序中是如何书写的,如下面的输出所示:
记住,这些表示方法仅仅是为了表达上的方便。例如,如果CGA视频内存段为十六进制B000,则不必在程序中使用之前将它转换为十进制数45056,而只需要使用0xB000即可。但是不管把值书写为10,012还是0xA,都将以相同的方式存储在计算机中——被存储为二进制(以2为基数)。
顺便说一句,如果要以十六进制或八进制方式显示值,则可以使用cout的一些特殊特性。前面指出过,头文件iostream提供了控制符endl,用于指示cout重起一行。同样,它还提供了控制符dec、hex和oct,分别用于指示cout以十进制、十六进制和八进制格式显示整数。程序3.4使用了hex和oct以上述三种格式显示十进制42。默认格式为十进制,在修改格式之前,原来的格式将一直有效。
程序3.4 hexoct2.cpp
//hexoct2.cpp——display values in hex and octal
#include<iostream>
using namespace std;
int main()
{
int chest = 42;
int waist = 42;
int inseam = 42;
cout<<"Monsieur cuts a striking figure!\n";
cout<<"chest = "<<chest<<" (decimal for 42)"<<endl;
cout<<hex;
cout<<"waist = "<<waist<<" (hexadecimal for 42)"<<endl;
cout<<oct;
cout<<"inseam = "<<inseam<<" (octal for 42)"<<endl;
return 0;
}
下面是运行该程序时得到的输出:
诸如cout<<hex;等代码不会再屏幕上显示任何内容,而只是修改cout显示整数的方式。因此,控制符hex实际上是一条消息,告诉cout采取何种行为。另外,由于标识符hex位于名称空间std中,而程序使用了该名称空间,因此不能将hex用作变量名。然而,如果省略编译指令using,而使用std::cout、std::endl、std::hex和std::oct,则可以将hex用作变量名。
相关阅读
感谢作者分享,原文链接:http://blog.csdn.net/u012816041/article/details/49888631大O,渐进表示法,接下来我尝试用最简单的方式进行
“彩云之南”“彩云南”“云之南方”,每当人们提起云南时总是会不禁想到这样的美誉,但正是云南这独
电容是电子电器的重要组成部分,是电子知识的基础。而电容的单位换算、以及电容的分类和电容的符号是必须熟练掌握的,很多刚毕业的一
使用电脑编辑文章,需要用到一些特殊符号和标点符号,很多使用电脑的新朋友,对输入特殊符号和标点符号还不是那么明白输入的方法。下面
怎么打立方米符号m³ 打出m³立方米符号的方
首先,我们打开WORD,启动WORD的方法有很多种,下面先简单介绍下有哪几种常用的方法咯,希望大家不要为小编的罗嗦感到烦琐。嘿嘿。 1、开