今天复习到C++的变量与基本类型,再看整形。
一般情况下,我们会认为表示整数的数据类型叫做是整型,但实际上,C++中的整型包括表示整数、字符和布尔值的算术类型。理解这一点很简单,首先,整数就是通常指的整数,比如-655536,-200,-100,0,50,65535等;而字符char类型的数据也是可以参加算术运算的,比如,字符'a'等于整型97的,可通过if('a'==97) cout<<"Yes"<<endl;验证,程序输出是YES,表示字符'a'与整数97是相等的;布尔bool类型也是可以参与算术运算的,例如,char a = 'a';bool b = true;printf("%d\n",a+b);则输出的结果是98,表示a=97,b=1,而输出是(97+1)==98;因此,严格的来说,整型是表示整数、字符和布尔值等算术类型的合称。对于C++语言而言,整型就是包括整数型、字符型、布尔型。
整数型有:short、int、long等三种,其中,int为默认的整型,int类型的数据是一个机器字长,即你的CPU处理的位数,假设你的CPU是32位的,则一个int就是4个字节。short类型是半个机器字长,则为int的一半;而long则为通常是一或者两个机器字长,但在32位机器中,通常int与long是相同的,所以sizeof(int)==sizeof(long)==4是正确的。
字符类型有:char和wchar_t两种,其中,char为大家所知的单字节数据类型,8位数据。wchar_t是C++定义的,用于保存扩展字符集的,比如中文字符,实际上wchar_t是用unsigned short类型来定义数据的。
布尔类型:用bool关键字来申明,其值只有真和假,即true和false,true的int类型值为1,false的int类型值为0。0值算术类型都代表着false,而任何非0值都代表着true。布尔类型通常正规的定义和初始化如,bool b = true,当然也可以定义和初始如bool b1=1,bool b2='b'等等;然而,假设有程序 bool b = 'b';cout<<b<<endl;printf("%c\n",b);则程序输出为1和@脸型符号@,为什么不是98或者true或者'b',这不仅说明了任何非0数值都是true,而且也证明了bool类型的true值就是1,所以,任何值为true的bool值输出总是为1,而将1作为字符输出时就是@脸型字符@。这个例子也证明了在本人发表的随笔《if语句,C、C++、Java》一文中提到的,if(“xxxx”)内的条件表达式是true的原因。
不过,通常来说,整型主要是用以描述整数的,这种说法比较通用化,对于其他编程语言来说也是友善的说法。比如在java语言中,算术类型之间的转换还是必须严格的按照强制转型进行的。
整型(除bool类型外)可以分为带符号signed和无符号unsigned类型。带符号类型signed可以表示正负数、0,而无符号数则只能表示0和正数。默认情况下是带符号数的,例如 int i;相当于signed int i; 而要定义无符号数必须显示在前面加上unsigned加以说明,例如,unsigned int i。然而,对于char类型,char类型可以有三种类型:普通char、signed char和unsigned char,即便如此,char类型只有两种表示方式,即signed char和unsigned char。
带符号数与无符号数的区别在于,带符号数使用数据中的最高位作为符号位,剩余的坐数据位,而无符号数则使用全部的位bit作为数据位。假设以8位为例,则无符号数据使用全部的8位来表示数据,则数据的表示范围从0—255。而带符号使用最高位(第7位,从0位开始算)为符号位,该位若是1则表示负数,若是0表示正数,剩下的7位用来表示数据,则数据表示范围从-128—127。
整型是有表示范围的,那么如果在整型赋值时超过了类型所表示的范围,会有什么发生呢?
那么我们来看看以下几个程序。(条件:实验机器是32位)
第一题:
short i = (short)65535;
printf("%d\n",i);
程序输出的是:-1.
第二题:
short i = (short)65538;
printf("%d\n",i);
程序输出的是:2.
第三题:
short i = (short)-32769;
printf("%d\n",i);
程序输出的是:32767
为什么这样?为什么输出的不是我们赋予的预期值?
当然,这是赋予的值超出了数据的表示范围导致的。那么,为什么得到这样的值?
现在我们针对第一题,首先我们将65535十六进制表示为0xffff,转化为二进制是11111111 11111111刚好是16位,short类型是半个机器字长,因此为16位。由于此时i被定义为带符号数,最高位(第15位为1,负数),0xffff则正是-1的在机器中的补码。所以,输出刚好是-1。如果程序改为:
unsigned short i = (short)65535;
printf("%d\n",i);
则输出正好是65535;
针对第二题,变量i同样定义为带符号,首先将65538转换为二进制,则为1 00000000 00000010是17位二进制,由于short类型只有16位,因此,只截取出后16位00000000 00000010,可见,结果正式带符号数+2。那么,如果把i定义为无符号数,或输出什么呢?还会是+2吗?同样的道理,17位二进制中,只照截取00000000 00000010部分,而无符号数只是把最高位算进数据位中,固然,00000000 00000010整体还是2。
针对第三题,首先我们将-32769用二进制补码表示为1 01111111 11111111是17位,因此,截取后16位01111111 11111111,而后16位的带符号数就是+32767。这就是为什么会得到这样的一些结果了。
偶然复习到C++的整型,结合一些自身经验,再看C/C++整型罢,欢迎指正!