Display unsigned quantities on correct number of bytes

E.g. don't display hex(short) value -1 as 0xffffffff, but as 0xffff.
diff --git a/lens_default.c b/lens_default.c
index 4348c76..532296c 100644
--- a/lens_default.c
+++ b/lens_default.c
@@ -61,17 +61,19 @@
 		if (value_extract_word(value, &l, arguments) < 0)	\
 			return -1;					\
 		int##BITS##_t i = l;					\
+		uint64_t v = (uint64_t)(uint##BITS##_t)i;		\
 		switch (format) {					\
 		case INT_FMT_unknown:					\
 			if (l < -10000 || l > 10000)			\
 		case INT_FMT_x:						\
-			return fprintf(stream, "%#"PRIx##BITS, i);	\
+			return fprintf(stream, "%#"PRIx64, v);		\
 		case INT_FMT_i:						\
+		case INT_FMT_default:					\
 			return fprintf(stream, "%"PRIi##BITS, i);	\
 		case INT_FMT_u:						\
-			return fprintf(stream, "%"PRIu##BITS, i);	\
+			return fprintf(stream, "%"PRIu64, v);		\
 		case INT_FMT_o:						\
-			return fprintf(stream, "0%"PRIo##BITS, i);	\
+			return fprintf(stream, "0%"PRIo64, v);		\
 		}							\
 	} while (0)
 
@@ -82,6 +84,7 @@
 	INT_FMT_o,
 	INT_FMT_x,
 	INT_FMT_unknown,
+	INT_FMT_default,
 };
 
 static int
@@ -326,12 +329,14 @@
 	case ARGTYPE_USHORT:
 	case ARGTYPE_UINT:
 	case ARGTYPE_ULONG:
-		if (int_fmt == INT_FMT_i)
+		if (int_fmt == INT_FMT_i || int_fmt == INT_FMT_default)
 			int_fmt = INT_FMT_u;
 		return format_integer(stream, value, int_fmt, arguments);
 
 	case ARGTYPE_CHAR:
-		return format_naked_char(stream, value, arguments);
+		if (int_fmt == INT_FMT_default)
+			return format_naked_char(stream, value, arguments);
+		return format_integer(stream, value, int_fmt, arguments);
 
 	case ARGTYPE_FLOAT:
 	case ARGTYPE_DOUBLE:
@@ -357,7 +362,8 @@
 default_lens_format_cb(struct lens *lens, FILE *stream,
 		       struct value *value, struct value_dict *arguments)
 {
-	return toplevel_format_lens(lens, stream, value, arguments, INT_FMT_i);
+	return toplevel_format_lens(lens, stream, value, arguments,
+				    INT_FMT_default);
 }
 
 struct lens default_lens = {
@@ -426,7 +432,7 @@
 	case ARGTYPE_POINTER:
 	case ARGTYPE_ARRAY:
 		return toplevel_format_lens(lens, stream, value,
-					    arguments, INT_FMT_i);
+					    arguments, INT_FMT_default);
 
 		int zero;
 	case ARGTYPE_SHORT:
@@ -494,7 +500,7 @@
 	case ARGTYPE_UINT:
 	case ARGTYPE_ULONG:
 		return toplevel_format_lens(lens, stream, value,
-					    arguments, INT_FMT_i);
+					    arguments, INT_FMT_default);
 
 	case ARGTYPE_CHAR:
 		return format_char(stream, value, arguments);