Index: kernel/generic/src/printf/printf_core.c
===================================================================
--- kernel/generic/src/printf/printf_core.c	(revision 712c4bac34d2d8ac8d7e35e7e48ff1c293c0ffb8)
+++ kernel/generic/src/printf/printf_core.c	(revision c9f703bcef572525b7b64f9d1b678615bfbf1f14)
@@ -75,4 +75,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.
  */
@@ -207,5 +226,5 @@
 	}
 	
-	return (int) (counter + 1);
+	return (int) (counter);
 }
 
@@ -245,5 +264,5 @@
 	}
 	
-	return (int) (counter + 1);
+	return (int) (counter);
 }
 
@@ -832,24 +851,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:
@@ -866,20 +886,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++;
-					}
-				}
 			}
 			
