Index: uspace/lib/c/generic/io/printf_core.c
===================================================================
--- uspace/lib/c/generic/io/printf_core.c	(revision b48d04693b3416fe0c2e8bfff373f7c147ef35aa)
+++ uspace/lib/c/generic/io/printf_core.c	(revision 7fadb6526b88d8a8d0bbeb5d5997969a53e7e66d)
@@ -73,4 +73,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.
@@ -831,24 +850,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:
@@ -865,20 +885,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++;
-					}
-				}
 			}
 			
