How Python Implements "long integer"?
Pedram
pm567426 at gmail.com
Mon Jul 6 11:13:00 EDT 2009
Hello Mr. Dickinson. Glad to see you again :)
On Jul 6, 5:46 pm, Mark Dickinson <dicki... at gmail.com> wrote:
> On Jul 6, 1:24 pm, Pedram <pm567... at gmail.com> wrote:
>
> > OK, fine, I read longobject.c at last! :)
> > I found that longobject is a structure like this:
>
> > struct _longobject {
> > struct _object *_ob_next;
> > struct _object *_ob_prev;
>
> For current CPython, these two fields are only present in debug
> builds; for a normal build they won't exist.
I couldn't understand the difference between them. What are debug
build and normal build themselves? And You mean in debug build
PyLongObject is a doubly-linked-list but in normal build it is just an
array (Or if not how it'll store in this mode)?
> > Py_ssize_t ob_refcnt;
> > struct _typeobject *ob_type;
>
> You're missing an important field here (see the definition of
> PyObject_VAR_HEAD):
>
> Py_ssize_t ob_size; /* Number of items in variable part */
>
> For the current implementation of Python longs, the absolute value of
> this field gives the number of digits in the long; the sign gives the
> sign of the long (0L is represented with zero digits).
Oh, you're right. I missed that. Thanks :)
> > digit ob_digit[1];
>
> Right. This is an example of the so-called 'struct hack' in C; it
> looks as though there's just a single digit, but what's intended here
> is that there's an array of digits tacked onto the end of the struct;
> for any given PyLongObject, the size of this array is determined at
> runtime. (C99 allows you to write this as simply ob_digit[], but not
> all compilers support this yet.)
WOW! I didn't know anything about 'struct hacks'! I read about them
and they were very wonderful. Thanks for your point. :)
> > }
> > And a digit is a 15-item array of C's unsigned short integers.
>
> No: a digit is a single unsigned short, which is used to store 15 bits
> of the Python long. Python longs are stored in sign-magnitude format,
> in base 2**15. So each of the base 2**15 'digits' is an integer in
> the range [0, 32767). The unsigned short type is used to store those
> digits.
>
> Exception: for Python 2.7+ or Python 3.1+, on 64-bit machines, Python
> longs are stored in base 2**30 instead of base 2**15, using a 32-bit
> unsigned integer type in place of unsigned short.
>
> > Is this structure is constant in
> > all environments (Linux, Windows, Mobiles, etc.)?
>
> I think it would be dangerous to rely on this struct staying constant,
> even just for CPython. It's entirely possible that the representation
> of Python longs could change in Python 2.8 or 3.2. You should use the
> public, documented C-API whenever possible.
>
> Mark
Thank you a lot Mark :)
More information about the Python-list
mailing list