// gcc -Wall Number.c -o ./Number
// ./Number 0 5 23 345 -2 99999999 -99999999 2147483647 -2147483648

#include <stdio.h>
#include <stdlib.h>

union {
  int n;
  unsigned int u;
} onion;

static char *binary(int n, int nc) {
  char *str = (char *) malloc(100 * sizeof(char));
  int pos = nc + 2;
  int which = 1;
  for (int i = 0; i < nc; i++) {
    str[pos--] = (n & which) ? '1' : '0';
    if (i % 8 == 7 && pos > 0) str[pos--] = ' ';
    which <<= 1;
  }
  return str;
}

int main(int argc, char *argv[]) {
  if (argc < 2) {
    printf("Usage: Number 123 -44\n");
    exit(0);
  }

  printf("%11s  %-8s  %-11s  %-35s  %10s\n", "Decimal", "Hex", "Octal", "Binary", "Unsigned");
  for (int i = 1; i < argc; i++) {
    onion.n = atoi(argv[i]);
    printf("%11d  %08x  %011o  %s  %10u\n", onion.n, onion.n, onion.n, binary(onion.n, 32), onion.u);
  }
}

