读Python源码(二)Python整数如何进行加减运算

本文详细解析Python中整数加减运算的实现,以8个比特位为例,探讨ob_digit元素的限制及如何防止溢出。加法运算主要通过long_add函数完成,当ob_size绝对值小于等于1时,通过C语言相加再转化为Python整数对象。减法运算与加法类似。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:

本节主要目的要基本了解python中整数加减运算的实现,在此之前要先了解python中整数实现方式可以先查看(一)之后再看本节。

注:这里说明一下,下面介绍均已8个比特位举例。那么ob_digit 每一个元素我们认定最多只能占7位。从源码中类推过来,这样是为了防止两数相加溢出问题,比如255+255 这时8位肯定放不下了,只占7位最多127+127=254。

1.加法运算

在了解了整数实现之后,我们在同一文件下(longobject.c)可以发现long_add函数实现了两整数相加的运算,那么接下来我们就来一步一步分析其实现:

static PyObject *
long_add(PyLongObject *a, PyLongObject *b)
{
    PyLongObject *z;

    CHECK_BINOP(a, b);

    if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) {
        return PyLong_FromLong(MEDIUM_VALUE(a) + MEDIUM_VALUE(b));
    }
    if (Py_SIZE(a) < 0) {
        if (Py_SIZE(b) < 0) {
            z = x_add(a, b);
            if (z != NULL) {
                /* x_add received at least one multiple-digit int,
                   and thus z must be a multiple-digit int.
                   That also means z is not an element of
                   small_ints, so negating it in-place is safe. */
                assert(Py_REFCNT(z) == 1);
                Py_SIZE(z) = -(Py_SIZE(z));
            }
        }
        else
            z = x_sub(b, a);
    }
    else {
        if (Py_SIZE(b) < 0)
            z = x_sub(a, b);
        else
            z = x_add(a, b);
    }
    return (PyObject *)z;
}

从上面这段代码中首先可以看到当整数ob_digit长度<=1的时候是通过PyLong_FromLong(MEDIUM_VALUE(a) + MEDIUM_VALUE(b))来求值的,那么接下来就简单看一下它的实现方式:

先将a,b的值通过C相加之后再由 PyLong_FromLong转成Python的整数对象,那么接下来我们就先看一下它是如何转换的。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值