From 0d2d87d202c62182983c9d7edce978a0c9c9aad1 Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Tue, 20 Aug 2002 19:00:22 +0000 Subject: long_format(), long_lshift(): Someone on c.l.py is trying to boost SHIFT and MASK, and widen digit. One problem is that code of the form digit << small_integer implicitly assumes that the result fits in an int or unsigned int (platform-dependent, but "int sized" in any case), since digit is promoted "just" to int or unsigned via the usual integer promotions. But if digit is typedef'ed as unsigned int, this loses information. The cure for this is just to cast digit to twodigits first. --- Objects/longobject.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/longobject.c b/Objects/longobject.c index 856230e..9e641af 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -949,7 +949,7 @@ long_format(PyObject *aa, int base, int addL) ++basebits; for (i = 0; i < size_a; ++i) { - accum |= a->ob_digit[i] << accumbits; + accum |= (twodigits)a->ob_digit[i] << accumbits; accumbits += SHIFT; assert(accumbits >= basebits); do { @@ -2345,7 +2345,7 @@ long_lshift(PyObject *v, PyObject *w) z->ob_digit[i] = 0; accum = 0; for (i = wordshift, j = 0; j < oldsize; i++, j++) { - accum |= a->ob_digit[j] << remshift; + accum |= (twodigits)a->ob_digit[j] << remshift; z->ob_digit[i] = (digit)(accum & MASK); accum >>= SHIFT; } -- cgit v0.12