Print right hex value for MIN_INT (#1155)

diff --git a/SStream.c b/SStream.c
index a332f89..269bec5 100644
--- a/SStream.c
+++ b/SStream.c
@@ -8,6 +8,7 @@
 #include <stdio.h>
 #endif
 #include <string.h>
+#include <limits.h>
 
 #include <capstone/platform.h>
 
@@ -58,8 +59,12 @@
 		else
 			SStream_concat(O, "#%"PRIu64, val);
 	} else {
-		if (val <- HEX_THRESHOLD)
-			SStream_concat(O, "#-0x%"PRIx64, (uint64_t)-val);
+		if (val <- HEX_THRESHOLD) {
+			if (val == LONG_MIN)
+				SStream_concat(O, "#-0x%"PRIx64, (uint64_t)val);
+			else
+				SStream_concat(O, "#-0x%"PRIx64, (uint64_t)-val);
+		}
 		else
 			SStream_concat(O, "#-%"PRIu64, -val);
 	}
@@ -82,8 +87,12 @@
 		else
 			SStream_concat(O, "%"PRIu64, val);
 	} else {
-		if (val <- HEX_THRESHOLD)
-			SStream_concat(O, "-0x%"PRIx64, (uint64_t)-val);
+		if (val <- HEX_THRESHOLD) {
+			if (val == LONG_MIN)
+				SStream_concat(O, "-0x%"PRIx64, (uint64_t)val);
+			else
+				SStream_concat(O, "-0x%"PRIx64, (uint64_t)-val);
+		}
 		else
 			SStream_concat(O, "-%"PRIu64, -val);
 	}
@@ -106,8 +115,12 @@
 		else
 			SStream_concat(O, "#%u", val);
 	} else {
-		if (val <- HEX_THRESHOLD)
-			SStream_concat(O, "#-0x%x", (uint32_t)-val);
+		if (val <- HEX_THRESHOLD) {
+			if (val == INT_MIN)
+				SStream_concat(O, "#-0x%x", (uint32_t)val);
+			else
+				SStream_concat(O, "#-0x%x", (uint32_t)-val);
+		}
 		else
 			SStream_concat(O, "#-%u", -val);
 	}
@@ -121,8 +134,12 @@
 		else
 			SStream_concat(O, "%u", val);
 	} else {
-		if (val <- HEX_THRESHOLD)
-			SStream_concat(O, "-0x%x", (uint32_t)-val);
+		if (val <- HEX_THRESHOLD) {
+			if (val == INT_MIN)
+				SStream_concat(O, "-0x%x", (uint32_t)val);
+			else
+				SStream_concat(O, "-0x%x", (uint32_t)-val);
+			}
 		else
 			SStream_concat(O, "-%u", -val);
 	}