Python 内部是如何实现整数相加不溢出的?

说实话昨天的文章划水了,阅读量就是最好的证明。这里读者的水平还是很高的,一看就看出了我的偷懒,标题 Python 的整数有边界么?肯定没有啊,于是就不打开看了。不过今天,我想接着昨天的话题...
摘要由CSDN通过智能技术生成

说实话昨天的文章划水了,阅读量就是最好的证明。这里读者的水平还是很高的,一看就看出了我的偷懒,标题 Python 的整数有边界么?肯定没有啊,于是就不打开看了。不过今天,我想接着昨天的话题,聊一聊 Python 是如何实现整数相加而不溢出的?

1、如何表示一个整数

要想了解这个,那就需要看 Python 的源代码[1],Python中的整数底层对应的结构体是PyLongObject,它位于 longobject.h[2] 中。

逐步展开如下:

//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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值