
3.4 整型数据
整型数据分为整型常量数据与整型变量数据两种。
3.4.1 整型常量
整型常量就是整常数。在C语言中,使用的整常数有十进制、八进制和十六进制3种。
1)十进制整常数:十进制整常数没有前缀,其数码为0~9。
以下各数是合法的十进制整常数:237、-568、65535、1627。
以下各数不是合法的十进制整常数:028(不能有前导0)、23D(含有非十进制数码)。
在程序中是根据前缀来区分各种进制数的。因此,在书写常数时不要把前缀弄错,以免结果不正确。
2)八进制整常数:八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7。八进制数通常是无符号数。
以下各数是合法的八进制数:015(十进制为13)、0101(十进制为65)、0177777(十进制为65535);以下各数不是合法的八进制数:256(无前缀0)、03A2(包含了非八进制数码)、-0127(出现了负号,一般不这么用)。
3)十六进制整常数:十六进制整常数的前缀为0X或0x,其数码取值为0~9,A~F或a~f(代表10~15)。
以下各数是合法的十六进制整常数:0X2A(十进制为42)、0XA0(十进制为160)、0XFFFF (十进制为65535 );以下各数不是合法的十六进制整常数:5A (无前缀0X )、0X3H(含有非十六进制数码)。
整型常数可以有后缀。在16位字长的机器上,基本整型的长度也为16位,因此表示的数的范围也是有限定的。如16位的基本整型常数,其十进制无符号整常数的范围为0~65535,有符号数的范围为-32768~+32767;八进制无符号数的表示范围为0~0177777,十六进制无符号数的表示范围为0X0~0XFFFF或0x0~0xFFFF。如果使用的数超过了上述范围,就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的。
例如,十进制长整常数:158L(十进制为158)、358000L(十进制为358000);八进制长整常数:012l(十进制为10)、077l(十进制为63)、0200000L(十进制为65536);十六进制长整常数:0X15L(十进制为21)、0XA5L(十进制为165)、0X10000L(十进制为65536)。
长整数158L和基本整常数158在数值上并无区别。但对158L,因为是长整型量,C语言编译系统将为它分配4个字节的存储空间。而对158,因为是基本整型,有的系统可能只分配2个字节的存储空间。因此,在运算和输出格式上要予以注意,避免出错。
无符号数也可用后缀表示,整型常数的无符号数的后缀为“U”或“u”。例如,358U,0x38Au,235Lu均为无符号数。
前缀、后缀可同时使用以表示各种类型的数。如0XA5Lu表示十六进制无符号长整数A5,其十进制为165。
4)枚举常量:enum weekday{ sun,mon,tue,wed,thu,fri,sat }定义了枚举类型weekday,枚举类型weekday中的sun,mon,tue,wed,thu,fri,sat等为枚举常量,实际上其缺省值分别为0,1,2,3,4,5,6。有关枚举类型的详细内容请参阅后续章节。
3.4.2 整型变量
1.整型数据在内存中的存放形式
整型数据是以补码表示的,正数的补码和原码(即该正整数一定字节数的二进制形式)相同;负数的补码是将该数的绝对值的二进制形式按位取反再(末位)加1。
例如,10的补码(2个字节时)为00000000 00001010;-10的补码为11111111 11110110。若为4字节整数,则10的补码为00000000 00000000 00000000 00001010;-10的补码为:11111111 1111111 1 11111111 11110110。
对于整数的补码表示,可以发现一个规律,左面的第一位是表示符号的,正数为0,负数为1。
说明:原码表示法在数值前面增加了一位符号位(即最高位为符号位),该位为0表示正数,为1表示负数,其余二进制位表示数值的大小。例如,假设用8位二进制表示一个整数,+10的原码为00001010,-10的原码就是10001010;假设用4个字节即32位二进制表示一个整数,+10的原码为00000000 00000000 00000000 00001010,-10的原码就是10000000 00000000 00000000 00001010。
2.整型变量的分类
1)基本型:类型说明符为int,在内存中占2或4个字节。
2)短整量:类型说明符为short int或short。所占字节和取值范围均与基本型相同,但在VC++2010中字节数为基本型的一半(即基本型为4个字节,短整数为2个字节)。
3)长整型:类型说明符为long int或long,在内存中占4个字节。
4)无符号型:类型说明符为unsigned。
无符号型又可与上述3种类型匹配,构成以下几种类型。
● 无符号基本型:类型说明符为unsigned int或unsigned。
● 无符号短整型:类型说明符为unsigned short。
● 无符号长整型:类型说明符为unsigned long。
各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故不能表示负数,而正整数范围扩大1倍。
以VC++2010中4字节整数基本型来说,整数的范围及其变化如下。
1)从00000000 00000000 00000000 00000000开始逐个加1变化到01111111 11111111 11111111 11111111,整数范围对应为:0~2147483647(0~(231-1))。
2)从10000000 00000000 00000000 00000000开始逐个加1变化到11111111 11111111 11111111 11111111,整数范围对应为:-2147483648~-1(-231~-20)。
为此,VC++ 2010中4字节基本型整数的范围为:-2147483648~2147483647,其他字节数整数的范围情况类似。
注意:整数按补码方式存储,最大正整数再加1,突变为最小负整数。C语言里整数的表示范围是有限的,变化范围由存储整数的字节数决定,对于4个字节的整数来说,其变化范围如图3-4所示,超出变化范围时就产生整数溢出,超出部分被舍去。

图3-4 C语言整数的变化范围示意图
表3-1列出了Turbo C(或Win-TC)、VC++ 2010中各类整型量所分配的内存字节数及数的表示范围。
表3-1 整型类型的数据及其数值范围

说明:Turbo C与Win-TC,主要是界面不同,实质基本相同。为此,本书在Win-TC环境中的操作,基本适用于Turbo C环境。
下面编程输出各种类型被分配的字节数,不同的C语言编译环境程序运行结果会有差异。
【例3-3】显示多种类型被分配的字节数。

说明:这里sizeof(i)或sizeof(int)能显示int类型占用的字节数,其他类型也类似。在不同C语言编译环境中,用sizeof()运算能把数据类型、运算表达式等的占用字节情况完全搞清楚。
运行结果:

说明:没有特别说明时,运行结果都是指在VC++6.0/2010中的运行结果。
【例3-4】领会整数编码方式。


运行结果:
说明:运行本程序,能感受到最大正整数加1后突变到最小整数的情况,能进一步理解正、负整数在相应字节范围内的布局情况,也能更好地理解各种整数的表示范围。
3.整型变量的定义
变量定义的一般形式为

在书写变量定义时,应注意以下几点。
1)允许在一个类型说明符后定义多个相同类型的变量,各变量名之间用逗号(,)间隔。类型说明符与变量名之间至少用一个空格间隔。
2)最后一个变量名之后必须以分号(;)结尾。
3)变量定义必须放在变量使用之前,一般放在函数体的开头部分。
【例3-5】整型变量的定义与使用。


4.整型数据的溢出
【例3-6】整型数据的溢出。

运行结果:
2147483647的二进制为01111111111111111111111111111111
-2147483648的二进制为10000000000000000000000000000000
思考:按上面例题中带注释语句给出的提示,做相应替换修改后,看运行结果如何?为什么?
【例3-7】不同整型类型间的混合运算。

说明:从程序可以看到,x是长整型变量,a是基本型变量。它们之间允许进行运算,运算结果为长整型。但c被定义为基本型,因此,最后结果为基本型。本例说明,不同类型的量可以参与运算并相互赋值。而其中的类型转换是由编译系统自动完成的。