Index: Modules/_pickle.c =================================================================== --- Modules/_pickle.c (revision 64162) +++ Modules/_pickle.c (working copy) @@ -2694,24 +2694,24 @@ * of x-platform bugs. */ static long -calc_binint(char *s, int size) +calc_binint(char *bytes, int size) { - unsigned char c; - int i; - long x = 0L; + unsigned char *s = (unsigned char *)bytes; + int i = size; + long x = 0; for (i = 0; i < size; i++) { - c = (unsigned char)s[i]; - x |= (long)c << (i * 8); + x |= (long)s[i] << (i * 8); } -#if SIZEOF_LONG > 4 + /* Unlike BININT1 and BININT2, BININT (more accurately BININT4) * is signed, so on a box with longs bigger than 4 bytes we need * to extend a BININT's sign bit to the full width. */ - if (x == 4 && x & (1L << 31)) - x |= (~0L) << 32; -#endif + if (SIZEOF_LONG > 4 && size == 4) { + x |= -(x & (1L << 31)); + } + return x; }