
2.3 整型数据
2.3.1 整型常量
整型常量就是指直接使用的整型常数,如128、-256。整型常量可以是:
● 长整型:15000L -240000L 020000L 0x35000L
● 短整型:150 620U 06900 0x2400
● 有符号整型:-45 5462L 08500 0x147
● 无符号整型:500U 1000U 0560U 0x489U
说明:
(1)在整型常量后面加上符号L,表示该常量是长整型,如1000L,加上U表示该常量是无符号整型,如500U,否则就是有符号整型,如500。
(2)以0开头的数,是八进制数,以0x开头的数是十六进制数。
(3)短整型数可以是无符号数,有符号数也可以是长整型数。
(4)有符号数可以为负数,无符号数只能是正数。
(5)当一个整型常数足够大时,即使其后不加L,该数也为长整型。
注意:L和U既可大写,又可小写。
整型常量可以有以下3种表示形式:
(1)十进制整数,十进制整数没有前缀。其数码为0~9。如124、-456、45。在程序中是根据前缀来区分各种进制数的。因此在书写常数时不要把前缀弄错造成结果不正确。
以下各数不是合法的十进制整常数:023(不能有前导0),23D(含有非十进制数码)。
(2)八进制整数,需要在常数前加上0进行修饰,数码取值为0~7。八进制数通常是无符号数,如0123、0456。
以下各数不是合法的八进制数:256(无前缀0),03A2(包含了非八进制数码),-0127(出现了负号)。
(3)十六进制整数,需要在常数前加上0x进行修饰,其数码取值为0~9,A~F或a~f,如0x1A3,0x3D7,0x23。
以下各数不是合法的十六进制整常数:5A(无前缀0X),0X3H(含有非十六进制数码)。
整型常数的后缀:在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。
整型变量可分为int、short int、long int和unsigned int、unsigned short、unsigned long等类别,那么常量是否也有这些类别?在将一个整型常量赋值给上述几种类别的整型变量时如何做到类型匹配?
请注意以下几点:
(1)一个整数,如果其值在-32768~32767范围内,认为它是short int型,它可以赋值给short int型、int型和long int型变量。
(2)一个整数,如果其值超过了上述范围,而在-2147483648~2147483647范围内,则认为它是长整型。可以将它赋值给int型和long int型变量。
(3)如果所用的C语言版本分配给int型与long int型数据在内存中占据的长度相同,则它们表示范围相同,因此一个int型常量同时也是一个long int型常量,可以赋给int型或long int型变量。
(4)一个整型常量后面加一个字母u或U,认为是unsigned int型,如12345u在内存中按unsigned int规定的方式存放(存储单元中最高位不作为符号位,而用来存储数据)。如果写成-12345u,则先将-12345转换成其补码53191,然后按无符号数存储。
(5)在一个整型常量后面加一个字母l或L,则认为是long int型常量,例如1231、432L、0L等,往往用于函数调用中。如果函数的形参为long int型,则要求实参也为long int型。