Fix hex literal bug.

Large hex literals would lose their minus sign.
diff --git a/Changelog b/Changelog
index 13e86e3..d9d2d75 100644
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,6 @@
+2018-09-09:
+  Fix bug where large hex literals would lose their minus sign.
+
 2017-08-05:
   Tagged v3.0.0.
   Due to the directory rename switching to a new version number.
diff --git a/double-conversion/double-conversion.cc b/double-conversion/double-conversion.cc
index 6f21a01..a87cf4a 100644
--- a/double-conversion/double-conversion.cc
+++ b/double-conversion/double-conversion.cc
@@ -626,7 +626,8 @@
   }
 
   ASSERT(number != 0);
-  return Double(DiyFp(number, exponent)).value();
+  double result = Double(DiyFp(number, exponent)).value();
+  return sign ? -result : result;
 }
 
 
diff --git a/test/cctest/test-conversions.cc b/test/cctest/test-conversions.cc
index 42bca87..77903b9 100644
--- a/test/cctest/test-conversions.cc
+++ b/test/cctest/test-conversions.cc
@@ -2514,6 +2514,43 @@
   CHECK_EQ(Double::NaN(), StrToD("x3", flags, 0.0,
                                  &processed, &all_used));
   CHECK_EQ(0, processed);
+
+  CHECK_EQ(-5.634002666912405e+27, StrToD("-0x123456789012345678901234",
+                                          flags, 0.0,
+                                          &processed, &all_used));
+  CHECK(all_used);
+
+  CHECK_EQ(72057594037927940.0, StrToD("0x100000000000001", flags, 0.0,
+                                       &processed, &all_used));
+  CHECK(all_used);
+
+  CHECK_EQ(72057594037927940.0, StrToD("0x100000000000000", flags, 0.0,
+                                       &processed, &all_used));
+  CHECK(all_used);
+
+  CHECK_EQ(295147905179352830000.0, StrToD("0x100000000000000001", flags, 0.0,
+                                       &processed, &all_used));
+  CHECK(all_used);
+
+  CHECK_EQ(295147905179352830000.0, StrToD("0x100000000000000000", flags, 0.0,
+                                       &processed, &all_used));
+  CHECK(all_used);
+
+  CHECK_EQ(295147905179352900000.0, StrToD("0x100000000000008001", flags, 0.0,
+                                           &processed, &all_used));
+  CHECK(all_used);
+
+  CHECK_EQ(295147905179352830000.0, StrToD("0x100000000000008000", flags, 0.0,
+                                           &processed, &all_used));
+  CHECK(all_used);
+
+  CHECK_EQ(295147905179352960000.0, StrToD("0x100000000000018001", flags, 0.0,
+                                           &processed, &all_used));
+  CHECK(all_used);
+
+  CHECK_EQ(295147905179352960000.0, StrToD("0x100000000000018000", flags, 0.0,
+                                           &processed, &all_used));
+  CHECK(all_used);
 }