vsz and rss are unsigned longs (ulong ~= width of void* =>
suitable for expressing total RAM in system). We account
for "32 bit in 64 bit" systems by storing kbytes, not bytes
there. Should allow for up to ~2000 Gb RAM on 32 bits.

diff --git a/include/libbb.h b/include/libbb.h
index 678c561..6c6b486 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -891,7 +891,7 @@
 	USE_SELINUX(char *context;)
 	/* Everything below must contain no ptrs to malloc'ed data:
 	 * it is memset(0) for each process in procps_scan() */
-	unsigned vsz, rss; /* we round it to kbytes */
+	unsigned long vsz, rss; /* we round it to kbytes */
 	unsigned long stime, utime;
 	unsigned pid;
 	unsigned ppid;
diff --git a/procps/ps.c b/procps/ps.c
index 805fe06..f5c801d 100644
--- a/procps/ps.c
+++ b/procps/ps.c
@@ -48,7 +48,7 @@
 	sprintf(buf, "%*u", size, ps->pgid);
 }
 
-static void put_u(char *buf, int size, unsigned u)
+static void put_lu(char *buf, int size, unsigned long u)
 {
 	char buf5[5];
 	smart_ulltoa5( ((unsigned long long)u) << 10, buf5);
@@ -57,12 +57,12 @@
 
 static void func_vsz(char *buf, int size, const procps_status_t *ps)
 {
-	put_u(buf, size, ps->vsz);
+	put_lu(buf, size, ps->vsz);
 }
 
 static void func_rss(char *buf, int size, const procps_status_t *ps)
 {
-	put_u(buf, size, ps->rss);
+	put_lu(buf, size, ps->rss);
 }
 
 static void func_tty(char *buf, int size, const procps_status_t *ps)
@@ -405,7 +405,7 @@
 				len = printf("%5u %-8s        %s ",
 					p->pid, user, p->state);
 			else
-				len = printf("%5u %-8s %6u %s ",
+				len = printf("%5u %-8s %6lu %s ",
 					p->pid, user, p->vsz, p->state);
 		}