python c PyLongObject定义及实现1

typedef PY_UINT32_T digit;
#define PyObject_VAR_HEAD               \
    PyObject_HEAD                       \
    Py_ssize_t ob_size;

struct _longobject {
    PyObject_VAR_HEAD
    digit ob_digit[1];
};
typedef struct _longobject PyLongObject;

PyLongObject对象除了引用计数ob_refcnt,*ob_type指针,与PyIntObject不同的是,通过动态改变ob_digit数组的大小,以实现任意精度的长整形。 PyLongObject对象的绝对值表示为

SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)

当数值为0L时,ob_size = 0,不会为ob_digit数组分配内存。 当数值为负数时,ob_size < 0; 当创建一个PyLongObject时,内存分配函数会为ob_digit数组分配足够的空间,所以ob_digit[0] … ob_digit[abs(ob_size)-1]是有效的。 为结构体的成员数组动态分配大小