diff --git a/Include/longintrepr.h b/Include/longintrepr.h index c32d72c86e8..d71329394d4 100644 --- a/Include/longintrepr.h +++ b/Include/longintrepr.h @@ -19,6 +19,7 @@ extern "C" { long_pow() requires that SHIFT be divisible by 5. */ typedef unsigned short digit; +typedef short sdigit; /* signed variant of digit */ #define BASE_TWODIGITS_TYPE long typedef unsigned BASE_TWODIGITS_TYPE twodigits; typedef BASE_TWODIGITS_TYPE stwodigits; /* signed variant of twodigits */ diff --git a/Objects/longobject.c b/Objects/longobject.c index af222dea4a8..6a5a724c8b7 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -63,7 +63,7 @@ long_normalize(register PyLongObject *v) PyLongObject * _PyLong_New(Py_ssize_t size) { - if (size > MAX_LONG_DIGITS) { + if (size > (Py_ssize_t)MAX_LONG_DIGITS) { PyErr_SetString(PyExc_OverflowError, "too many digits in integer"); return NULL; @@ -1945,7 +1945,7 @@ long_compare(PyLongObject *a, PyLongObject *b) if (i < 0) sign = 0; else { - sign = (int)a->ob_digit[i] - (int)b->ob_digit[i]; + sign = (sdigit)a->ob_digit[i] - (sdigit)b->ob_digit[i]; if (Py_SIZE(a) < 0) sign = -sign; } @@ -2865,7 +2865,7 @@ long_pow(PyObject *v, PyObject *w, PyObject *x) for (i = Py_SIZE(b) - 1; i >= 0; --i) { digit bi = b->ob_digit[i]; - for (j = 1 << (PyLong_SHIFT-1); j != 0; j >>= 1) { + for (j = (digit)1 << (PyLong_SHIFT-1); j != 0; j >>= 1) { MULT(z, z, z) if (bi & j) MULT(z, a, z) @@ -3099,9 +3099,8 @@ long_bitwise(PyLongObject *a, { digit maska, maskb; /* 0 or PyLong_MASK */ int negz; - Py_ssize_t size_a, size_b, size_z; + Py_ssize_t size_a, size_b, size_z, i; PyLongObject *z; - int i; digit diga, digb; PyObject *v;