2.2.1 整数类型 int

整数就是没有小数部分的数值,分为正整数、0 和负整数。Python 语言提供了类型 int 用于表示现实世界中的整数信息,如班级里的人数、人的年龄、乒乓球比赛每方的得分等等。

基本数据类型的值都可通过字面值(literal)的形式表示出来,即以字面形式表现值。 整数类型的字面值表示形式和我们在现实世界中的写法一样,例如下列都是合法的整数:

123 -456 0

注意,整数字面值是不能包含小数点的,即使小数点后面什么都没有!读者也许会觉得 这句话很奇怪,因为在数学中从没见过一个数包含小数点但小数点后面啥也没有的情形。然 而,在 Python 中确实允许以下形式的字面值:

123. -456. 0.

但它们都不是整数!事实上,以上三个数分别等于 123.0、-456.0 和 0.0,它们属于后 文即将介绍的浮点数类型。

Python 语言为整数类型提供了通常的数学运算,运算符及其含义如表 2.1 所示:

运算符 含义
+
-
*
/
** 乘方
% 取余数
abs() 取绝对值

例如:

>>> 23 + 45
68
>>> 56 – 12
44
>>> 8 * 2
16
>>> 11 / 3
3
>>> 8 ** 2
64
>>> 18 % 5
3

表 2.1 整数运算符

>>> abs(-8)
8

可见,计算机实现的整数运算基本上和我们在数学课上所学的一样,除了一个例外—— 除法。由于例中的 11/3 是整数类型上的除法,运算结果仍然在整数类型当中,所以 Python 将商的小数部分直接舍弃了(未作四舍五入!),从而结果为 3。在程序中,本来希望得到精 确的除法结果,但因被除数和除数都是整数,导致结果误差过大甚至出错,这是初学 Python 编程的人很容易防错误的地方。要说明一下,表 2.1 中的 abs()并不是运算符,而是 Python 的内建函数,这里只是为了方便而将它列在了表中。

除了上面这些运算符,Python 还提供了一些运算符与变量赋值结合起来的表示法。例 如,在程序设计中经常用到一个变量递增的操作:x = x + 1。注意,这个式子在数学中 是不成立的,因为一个数不可能“等于”该数加 1。但在编程语言中这是一个完全合法的赋 值语句,它的含义是:将变量 x 所指向的值加 1,并将计算结果重新赋值给 x。鉴于这个操 作频繁使用,Python 和某些其他语言提供了一种简写形式:x += 1。请看例子:

>>> x = 123
>>> x += 1
>>> print x
124

还有其他一些类似的简写形式,参见表 2.2。

普通形式 简写形式
x = x + y x += y
x = x - y x -= y
x = x * y x *= y
x = x / y x /= y
x = x % y x %= y

表 2.2 赋值与运算结合

int 类型的局限性

在第 1 章中我们说过,计算思维是建立在计算机的能力和限制之上的。现在我们来讨论 整数类型的一个限制。

int 类型只是数学中的整数集合 I 在计算机中的表示,而一个事物和该事物的一种表示 之间未必可以划等号。事实上,类型 int 只表示了 I 的一个子集,I 是无穷集合,而 int 是有穷的。这是为什么呢?

在计算机底层,整数一般都是用特定长度的二进制数表示的。至于具体长度是多少,取 决于 CPU 的设计。目前个人计算机上多采用 32 个二进制位(bit,比特)的长度来表示整数, 故 Python 语言中的 int 类型就是 32 比特长度的整数值。利用一点排列组合知识,容易推 知:一个比特有两种可能的状态(0、1),两个比特有四种可能的状态(00、01、10、11), 三个比特有八种状态(000、001、010、011、100、101、110、111),…,32 个比特有 232

种可能的状态。用这 232 种状态显然只能表示 232 个整数,考虑到整数有正负,计算机底层 将这 232 个状态的一半用于表示非负整数,另一半用于表示负整数,从而类型 int 实际上是 由-231~231-1 之间的所有整数构成的集合①。

我们已经了解,数据是现实世界信息在计算机中的抽象,根据数据值的种类和操作的不 同而划分成不同数据类型。一般来说在逻辑层次上理解和使用数据类型就够了,不需要进一 步了解这些抽象在计算机底层的物理表示。然而,如果能对数据类型的底层表示方法有所了解,可以使数据和程序设计更好地建立在机器的能力和限制之上。

① 有的语言还支持用 32 比特表示 0~232-1 的无符号整数。