Repair portability of sign extension when reading signed ints on boxes

where sizeof(long)==8.  This *was* broken on boxes where signed right
shifts didn't sign-extend, but not elsewhere.  Unfortunately, apart
from the Cray T3E I don't know of such a box, and Guido has so far
refused to buy me any Cray machines for home Python testing <wink>.

More immediately interesting would be if someone could please test
this on *any* sizeof(long)==8 box, to make sure I didn't break it.
This commit is contained in:
Tim Peters 2001-04-08 23:39:38 +00:00
parent 9cec8fba06
commit f0e717bdb1

View File

@ -653,11 +653,9 @@ bu_int(const char *p, const formatdef *f)
do { do {
x = (x<<8) | (*p++ & 0xFF); x = (x<<8) | (*p++ & 0xFF);
} while (--i > 0); } while (--i > 0);
i = 8*(sizeof(long) - f->size); /* Extend the sign bit. */
if (i) { if (SIZEOF_LONG > f->size)
x <<= i; x |= -(x & (1L << (8*f->size - 1)));
x >>= i;
}
return PyInt_FromLong(x); return PyInt_FromLong(x);
} }
@ -767,11 +765,9 @@ lu_int(const char *p, const formatdef *f)
do { do {
x = (x<<8) | (p[--i] & 0xFF); x = (x<<8) | (p[--i] & 0xFF);
} while (i > 0); } while (i > 0);
i = 8*(sizeof(long) - f->size); /* Extend the sign bit. */
if (i) { if (SIZEOF_LONG > f->size)
x <<= i; x |= -(x & (1L << (8*f->size - 1)));
x >>= i;
}
return PyInt_FromLong(x); return PyInt_FromLong(x);
} }