Index: boot/generic/src/printf_core.c
===================================================================
--- boot/generic/src/printf_core.c	(revision 390d80d3311996c5f585280d3918fd3f577111a9)
+++ boot/generic/src/printf_core.c	(revision a31ca11f3fdb5acec686e5b9dd2537e18b5e70f6)
@@ -70,4 +70,23 @@
  */
 #define PRINT_NUMBER_BUFFER_SIZE  (64 + 5)
+
+/** Get signed or unsigned integer argument */
+#define PRINTF_GET_INT_ARGUMENT(type, ap, flags) \
+	({ \
+		unsigned type res; \
+		\
+		if ((flags) & __PRINTF_FLAG_SIGNED) { \
+			signed type arg = va_arg((ap), signed type); \
+			\
+			if (arg < 0) { \
+				res = -arg; \
+				(flags) |= __PRINTF_FLAG_NEGATIVE; \
+			} else \
+				res = arg; \
+		} else \
+			res = va_arg((ap), unsigned type); \
+		\
+		res; \
+	})
 
 /** Enumeration of possible arguments types.
@@ -171,5 +190,5 @@
 	}
 	
-	return (int) (counter + 1);
+	return (int) (counter);
 }
 
@@ -698,24 +717,25 @@
 			size_t size;
 			uint64_t number;
+			
 			switch (qualifier) {
 			case PrintfQualifierByte:
 				size = sizeof(unsigned char);
-				number = (uint64_t) va_arg(ap, unsigned int);
+				number = PRINTF_GET_INT_ARGUMENT(int, ap, flags);
 				break;
 			case PrintfQualifierShort:
 				size = sizeof(unsigned short);
-				number = (uint64_t) va_arg(ap, unsigned int);
+				number = PRINTF_GET_INT_ARGUMENT(int, ap, flags);
 				break;
 			case PrintfQualifierInt:
 				size = sizeof(unsigned int);
-				number = (uint64_t) va_arg(ap, unsigned int);
+				number = PRINTF_GET_INT_ARGUMENT(int, ap, flags);
 				break;
 			case PrintfQualifierLong:
 				size = sizeof(unsigned long);
-				number = (uint64_t) va_arg(ap, unsigned long);
+				number = PRINTF_GET_INT_ARGUMENT(long, ap, flags);
 				break;
 			case PrintfQualifierLongLong:
 				size = sizeof(unsigned long long);
-				number = (uint64_t) va_arg(ap, unsigned long long);
+				number = PRINTF_GET_INT_ARGUMENT(long long, ap, flags);
 				break;
 			case PrintfQualifierPointer:
@@ -732,20 +752,4 @@
 				counter = -counter;
 				goto out;
-			}
-			
-			if (flags & __PRINTF_FLAG_SIGNED) {
-				if (number & (0x1 << (size * 8 - 1))) {
-					flags |= __PRINTF_FLAG_NEGATIVE;
-					
-					if (size == sizeof(uint64_t)) {
-						number = -((int64_t) number);
-					} else {
-						number = ~number;
-						number &=
-						    ~(0xFFFFFFFFFFFFFFFFll <<
-						    (size * 8));
-						number++;
-					}
-				}
 			}
 			
