Only use 31 bits of error detail, shifting sign bit is not portable.
diff --git a/lib/zipint.h b/lib/zipint.h
index ee2a50d..5d72508 100644
--- a/lib/zipint.h
+++ b/lib/zipint.h
@@ -203,7 +203,7 @@
 extern const int _zip_err_details_count;
 
 /* macros for libzip-internal errors */
-#define MAX_DETAIL_INDEX 0xffffff
+#define MAX_DETAIL_INDEX 0x7fffff
 #define MAKE_DETAIL_WITH_INDEX(error, index) ((((index) > MAX_DETAIL_INDEX) ? MAX_DETAIL_INDEX : (int)(index)) << 8 | (error))
 #define GET_INDEX_FROM_DETAIL(error) (((error) >> 8) & MAX_DETAIL_INDEX)
 #define GET_ERROR_FROM_DETAIL(error) ((error) & 0xff)