说实话昨天的文章划水了,阅读量就是最好的证明。这里读者的水平还是很高的,一看就看出了我的偷懒,标题 Python 的整数有边界么?肯定没有啊,于是就不打开看了。不过今天,我想接着昨天的话题,聊一聊 Python 是如何实现整数相加而不溢出的?
1、如何表示一个整数
要想了解这个,那就需要看 Python 的源代码[1],Python中的整数底层对应的结构体是PyLongObject,它位于 longobject.h[2] 中。
![](https://img-blog.csdnimg.cn/img_convert/1a66e552bb817a76e7d937911a9f361f.png)
逐步展开如下:
//longobject.h
typedef struct _longobject PyLongObject; /* Revealed in longintrepr.h */
//longintrepr.h
struct _longobject {
PyObject_VAR_HEAD
digit ob_digit[1];
};
//合起来可以看成
typedef struct {
PyObject_VAR_HEAD
digit ob_digit[1];
} PyLongObject;
再把宏定义 PyObject_VAR_HEAD 展开:
typedef struct {
PyObject_HEAD
int ob_size;
digit ob_digit[1];
} PyLongObject;
再把宏定义 PyObject_HEAD 展开,结构体中的变量我已经作了注释:
typedef struct {
int ob_refcnt; //引用计数
struct _typeobject *ob_type; //变量类型
int ob_size; //用来指明变长对象中一共容纳了多少个元素
digit ob_digit[1]; //digit类型的数组,长度为1
} PyLongObject;
这里面的 ob_size 用来指明变长对象中一共容纳了多少个元素,也就是 ob_digit 数组的长度,而这个 ob_digit 数组显然只能是用来维护具体的值。
到这里已经很明显了&#x