零基础学C语言程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 整数

整数是最常见的、最简单的数据形式。在C语言中,我们不仅要学习如何表示整数,还要掌握其存放方式。

2.2.1 整数的进制表示

进制是一种计数方式。它决定了数字的表示方式及进位方式。在C语言中,整数可以使用4种进制进行表示。这4种进制分别是二进制、八进制、十进制与十六进制。

1. 用二进制表示整数

在用二进制表示整数时,要为整数添加一个前缀“0b”,如图2.5所示。将用二进制表示的整数称为二进制数。

图2.5 用二进制表示整数

2. 用八进制表示整数

二进制是计算机中最先使用的进制。随着计算机处理的数据越来越大,程序员使用二进制表示和读取数据也越来越麻烦,于是便产生了八进制。例如,有些游戏有8个大关卡,每个大关卡有8个小关卡,这些都符合“逢八进一”的规则,如图2.6所示。

图2.6 关卡符合“逢八进一”的规则

在用八进制表示整数时,要为整数添加一个前缀数字“0”,如图2.7所示。将用八进制表示的整数称为八进制数。八进制数的每位可以使用0~7,遵循“逢八进一”的规则。

图2.7 用八进制表示整数

【示例2-1】输出一个八进制数。

程序如下:

运行程序,输出以下内容:

从程序运行结果可以看出,输出的八进制数6没有前缀,这样就无法与十进制数进行区分。为了解决这个问题,使用%#o占位符可以使输出的八进制数带前缀。

【示例2-2】输出带前缀的八进制数。

程序如下:

运行程序,输出以下内容:

注意:使用%o占位符可以使输出的八进制数不带前缀;使用%#o占位符可以使输出的八进制数带前缀0。

助记:%o中的字母o来源于英文单词octal(意思为八进制的)。

二进制数转换为八进制数就是将二进制数从右向左每3位合并为1位。下面将一个二进制数111111转换为八进制数77,如图2.8所示。

图2.8 二进制数转换为八进制数

在转换时,有时会发现二进制数的位数无法以3位为单元进行分隔,此时就必须使用0来补位。下面将一个二进制数10011011转换为八进制数233,如图2.9所示。

图2.9 二进制数转换为八进制数

八进制数向二进制数转换的思路是八进制数的1位转换为二进制数的3位,而运算的顺序是从低位向高位依次进行。下面将一个八进制数17转换为二进制数1111,如图2.10所示。

图2.10 八进制数转换为二进制数

3. 用十进制表示整数

由于人有10个手指头,而十进制相对符合人的人体构造,所以十进制是人们最常用的进制。假如人和小鸡一样有8个指头,如图2.11所示,那么可能现在人们最常用的就是八进制。

图2.11 小鸡有8个指头

将用十进制表示的整数称为十进制数。十进制数的每位可以使用0~9,遵循“逢十进一”的规则。由于十进制数有负值,所以不能以数字“0”开始,但可以以负号开始,如图2.12所示。

图2.12 用十进制表示整数

【示例2-3】输出一个十进制数。

程序如下:

运行程序,输出以下内容:

助记:%d中的字母d来源于英文单词decimal(意思为十进制的)。

十进制数转换为二进制数会使用到辗除法。辗除法就是“除模取余”法。“除模取余”就是指将一个进制数转化成另一个进制数时,另一个进制数就是模,用将要转化的进制数除以模,取其余数即可。下面将十进制数19转换为二进制数10011,如图2.13所示。

图2.13 十进制数转换为二进制数

4. 用十六进制表示整数

随着计算机处理的数据不断增加,人们发现使用八进制也无法满足人们的需求,因此程序员创造出了十六进制。将用十六进制表示的整数称为十六进制数。例如,颜色的表示分为RGB模式与CMYK模式。其中,CMYK模式就是使用6位十六进制数来表示颜色的,如#FF0000。

在用十六进制表示整数时,要在整数前加“0X”或“0x”,如图2.14所示。十六进制数的每位可以使用0~9、A~F,遵循“逢十六进一”的规则。

图2.14 用十六进制表示整数

【示例2-4】输出一个十六进制数。

程序如下:

运行程序,输出以下内容:

从程序运行结果可以看出,输出的十六进制数5d没有前缀,如果想要在其前加前缀,就要使用%#x占位符。

助记:%x中的字母x来源于英文单词hex(意思为十六进制)。

【示例2-5】输出一个带前缀的十六进制数。

程序如下:

运行程序,输出以下内容:

从程序运行结果可以看出,输出的十六进制数0x5d带前缀,但其字母部分d为小写。如果想要输出字母部分为大写的带前缀的十六进制数,就要使用占位符%#X。

【示例2-6】输出字母部分为大写的带前缀的十六进制数。

程序如下:

运行程序,输出以下内容:

注意:使用%x占位符可以使输出的十六进制数不带前缀且字母部分为小写。使用%X占位符可以使输出的十六进制数不带前缀且字母部分为大写。使用%#x占位符可以使输出的十六进制数带前缀0x且字母部分为小写。使用%#X占位符可以使输出的十六进制数带前缀0X且字母部分为大写。

二进制数转换为十六进制数就是将二进制数从右向左每4位合并为1位。下面将一个二进制数10101100转换为十六进制数0xAC,如图2.15所示。

图2.15 二进制数转换为十六进制数

在转换时,有时会发现二进制数无法以4位为单元进行分隔,此时就要使用0来补位。例如,下面将一个二进制数11011转换为十六进制数0x1B,如图2.16所示。

图2.16 二进制数转换为十六进制数

在十六进制数转换为二进制数时,要把十六进制数的1位转换成二进制数的4位,而运算的顺序是从低位向高位依次进行的。下面将十六进制数73转换为二进制数,如图2.17所示。

图2.17 十六进制数转换为二进制数

助记:二进制数、八进制数、十进制数及十六进制数之间的转换如表2.3所示。

表2.3 二进制数、八进制数、十进制数及十六进制数之间的转换

2.2.2 整数类型

整数类型大体分为有符号整数类型和无符号整数类型。由于计算机的存储空间是有限的,所以在处理整数时要控制整数所占的存储空间大小。根据整数所占存储空间大小,有符号整数类型又分为整型、短整型、长整型3种。无符号整数类型又分为无符号整型、无符号短整型、无符号长整型3种。

1. 有符号整数类型

1)整型

在C语言中,整型是整数的默认保存类型,使用说明符int表示。一个整型数据占4个字节,如图2.18所示。

图2.18 一个整型数据占4个字节

由于存储空间有限,整型数据的取值范围是-231~(231-1),即-2 147 483 648~2 147 483 647,如图2.19所示。

图2.19 整型数据的取值范围

【示例2-7】输出整数的字节长度,判断整数是否会被默认保存为整型。

程序如下:

运行程序,输出以下内容:

【示例2-8】输出一个整型数据占几个字节。

程序如下:

运行程序,输出以下内容:

助记:int来源于英文单词integer(意思为整数)。

2)短整型

短整型是较小整数的保存类型,使用说明符short表示。一个短整型数据占2个字节,如图2.20所示。

图2.20 一个短整型数据占2个字节

短整型数据的取值范围是-215~(215-1),即-32 768~32 767,如图2.21所示。

图2.21 短整型数据的取值范围

【示例2-9】输出一个短整型数据占几个字节。

程序如下:

运行程序,输出以下内容:

助记:short的意思为短的。

3)长整型

长整型是较大整数的保存类型,使用说明符long表示。一个长整型数据占4个字节,如图2.22所示。

图2.22 一个长整型数据占4个字节

长整型数据的取值范围是-231~(231-1),即-2 147 483 648~2 147 483 647,如图2.23所示。

图2.23 长整型数据的取值范围

【示例2-10】输出一个短整型数据占几个字节。

程序如下:

运行程序,输出以下内容:

长整型数据要在数字后面加字母l或L,如355L。

【示例2-11】输出带L后缀的长整型数据的字节长度。

程序如下:

运行程序,输出以下内容:

助记:long的意思为长的。

2. 无符号整数类型

无符号整数类型数据只包含正数,这样就能将二进制数的符号位作为整数位。无符号整数类型数据比有符号整数类型数据的取值范围大一倍,如图2.24所示。

图2.24 无符号整数类型数据比有符号整数类型数据的取值范围扩大一倍

在有符号整数类型说明符前添加前缀unsigned,即构成对应的无符号整数类型说明符。在无符号整数类型数据后要加后缀字母u或U。

1)无符号整型

无符号整型使用说明符unsigned int表示。一个无符号整型数据占4个字节。无符号整型数据的取值范围为0~4 294 967 295。

2)无符号短整型

无符号短整型使用说明符undigned short表示。一个无符号短整型数据占2个字节。无符号短整型数据范围为0~65 535。

3)无符号长整型

无符号长整型使用说明符unsigned long表示。无符号长整型数据占4个字节。无符号长整型数据范围为0~4 294 967 295。

当处理的数据只有正整数时,此时使用无符号整数类型数据可以更好地利用计算机的存储空间,从而提高计算效率。

注意:随着时间推移,新增了很多编译器。这些编译器都能对C语言进行编译,导致不同编译器下的整数类型数据长度会有不同,以上的讲解都是基于Visual C++6.0与Visual Studio 2010进行讲解的。

助记:unsigned的意思为无符号的。

总结前面讲解的所有整数类型,如表2.4所示。

表2.4 6种整数类型