Fox for SF bug #123859: %[duxXo] long formats inconsistent.
diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py
index 266cbb6..c2c7244 100644
--- a/Lib/test/test_format.py
+++ b/Lib/test/test_format.py
@@ -63,11 +63,6 @@
 testboth("%d", 10L, "10")
 testboth("%d", 100000000000L, "100000000000")
 
-# Make sure big is too big to fit in a 64-bit int, else the unbounded
-# int formatting will be sidestepped on some machines.  That's vital,
-# because bitwise (x, X, o) formats of regular Python ints never
-# produce a sign ("+" or "-").
-
 big = 123456789012345678901234567890L
 testboth("%d", big, "123456789012345678901234567890")
 testboth("%d", -big, "-123456789012345678901234567890")
@@ -163,3 +158,19 @@
 testboth("%034.33o", big, "0012345670123456701234567012345670")
 # base marker shouldn't change that
 testboth("%0#34.33o", big, "0012345670123456701234567012345670")
+
+# Some small ints, in both Python int and long flavors).
+testboth("%d", 42, "42")
+testboth("%d", -42, "-42")
+testboth("%d", 42L, "42")
+testboth("%d", -42L, "-42")
+
+testboth("%x", 0x42, "42")
+# testboth("%x", -0x42, "ffffffbe") # Alas, that's specific to 32-bit machines
+testboth("%x", 0x42L, "42")
+testboth("%x", -0x42L, "-42")
+
+testboth("%o", 042, "42")
+# testboth("%o", -042, "37777777736") # Alas, that's specific to 32-bit machines
+testboth("%o", 042L, "42")
+testboth("%o", -042L, "-42")
diff --git a/Misc/NEWS b/Misc/NEWS
index 0d78e7f..14ba867 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -1,3 +1,23 @@
+What's New in Python 2.1 alpha 1?
+=================================
+
+Core language, builtins, and interpreter
+
+- %[duxXo] formats of negative Python longs now produce a sign
+  character.  In 1.6 and earlier, they never produced a sign,
+  and raised an error if the value of the long was too large
+  to fit in a Python int.  In 2.0, they produced a sign if and
+  only if too large to fit in an int.  This was inconsistent
+  across platforms (because the size of an int varies across
+  platforms), and inconsistent with hex() and oct().  Example:
+
+  >>> "%x" % -0x42L
+  '-42'  # in 2.1
+  'ffffffbe' # in 2.0 and before, on 32-bit machines
+  >>> hex(-0x42L)
+  '-0x42L'   # in all versions of Python
+
+
 What's New in Python 2.0?
 =========================
 
@@ -79,7 +99,7 @@
   --with-pydebug flag.  The expected warning is for getopt() in
   Modules/main.c.  This warning will be fixed for Python 2.1.
 
-- Fixed configure to add -threads argument during linking on OSF1. 
+- Fixed configure to add -threads argument during linking on OSF1.
 
 Tools and other miscellany
 
@@ -88,7 +108,7 @@
   comprehensions, and augmented assignments.  The new compiler should
   also be backwards compatible with Python 1.5.2; the compiler will
   always generate code for the version of the interpreter it runs
-  under. 
+  under.
 
 What's new in 2.0 release candidate 1 (since beta 2)?
 =====================================================
@@ -143,15 +163,15 @@
   the file-like object interface and with StringIO.  If operations are
   performed on a closed object, an exception is raised.  The truncate
   method now accepts a position argument and readline accepts a size
-  argument. 
+  argument.
 
 - There were many changes made to the linuxaudiodev module and its
   test suite; as a result, a short, unexpected audio sample should now
-  play when the regression test is run.  
+  play when the regression test is run.
 
   Note that this module is named poorly, because it should work
   correctly on any platform that supports the Open Sound System
-  (OSS). 
+  (OSS).
 
   The module now raises exceptions when errors occur instead of
   crashing.  It also defines the AFMT_A_LAW format (logarithmic A-law
@@ -200,7 +220,7 @@
 
 - configure now accepts a --with-suffix option that specifies the
   executable suffix.  This is useful for builds on Cygwin and Mac OS
-  X, for example. 
+  X, for example.
 
 - The mmap.PAGESIZE constant is now initialized using sysconf when
   possible, which eliminates a dependency on -lucb for Reliant UNIX.
@@ -211,7 +231,7 @@
   POLLRDNORM and related constants.
 
 - Darwin (Mac OS X):  Initial support for static builds on this
-  platform. 
+  platform.
 
 - BeOS: A number of changes were made to the build and installation
   process.  ar-fake now operates on a directory of object files.
@@ -254,7 +274,7 @@
   string is too long."
 
 - Better error message when continue is found in try statement in a
-  loop. 
+  loop.
 
 
 Standard library and extensions
@@ -345,7 +365,7 @@
   use buffer interface on Unicode strings.  Does not hang if group id
   is followed by whitespace.
 
-- StringIO: Size hint in readlines() is now supported as documented. 
+- StringIO: Size hint in readlines() is now supported as documented.
 
 - struct: Check ranges for bytes and shorts.
 
@@ -419,7 +439,7 @@
   PyArg_ParseTupleAndKeywords() now accepts "es#" and "es".
   PyArg_Parse() special cases "s#" for Unicode objects; it returns a
   pointer to the default encoded string data instead of to the raw
-  UTF-16. 
+  UTF-16.
 
 - Py_BuildValue accepts B format (for bgen-generated code).
 
@@ -448,7 +468,7 @@
   registry key.
 
 - On Unix, create .pyc/.pyo files with O_EXCL flag to avoid a race
-  condition. 
+  condition.
 
 
 Build and platform-specific issues
@@ -475,7 +495,7 @@
 
 - freeze: The modulefinder now works with 2.0 opcodes.
 
-- IDLE: 
+- IDLE:
   Move hackery of sys.argv until after the Tk instance has been
   created, which allows the application-specific Tkinter
   initialization to be executed if present; also pass an explicit
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 31d1b05..47da4ed 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -2897,10 +2897,7 @@
 			case 'X':
 				if (c == 'i')
 					c = 'd';
-				if (PyLong_Check(v) && PyLong_AsLong(v) == -1
-				    && PyErr_Occurred()) {
-					/* Too big for a C long. */
-					PyErr_Clear();
+				if (PyLong_Check(v)) {
 					temp = _PyString_FormatLong(v, flags,
 						prec, c, &pbuf, &len);
 					if (!temp)
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index b31675b..a297cac 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -5020,9 +5020,7 @@
 	    case 'X':
 		if (c == 'i')
 		    c = 'd';
-		if (PyLong_Check(v) && PyLong_AsLong(v) == -1
-		    && PyErr_Occurred()) {
-		    PyErr_Clear();
+		if (PyLong_Check(v)) {
 		    temp = formatlong(v, flags, prec, c);
 		    if (!temp)
 			goto onError;