Ese comando, convierte a unsigned long no sé muy bien el qué. Yo el único uso que conozco de las comillas simples es el de asignar el valor de un caracter a algo, es decir, su valor ascii. En tu primer ejemplo:
int t='0';
int t1='0';
int t2='0';
int t3='0';
unsigned long num = t;
unsigned long num1 = t1;
unsigned long num2 = t2;
unsigned long num3 = t3;
char usuario[5]={num,num1,num2,num3};
Podrías, perfectamente, haber asignado directamente char usuario[5]={t,t1,t2,t3} (por cierto, usuario[4] no lo usas) y el array contendría los valores ascii de t-t3. Sin pasos intermedios, podrías almacenar directamente char usuario[5]={'0','0','0','0'} y contendría lo mismo, y si lo que quieres es almacenar directamente un valor, en lugar de caracteres ascii, char usuario[5]={0,0,0,0} (sin las comillas simples).
A partir de aquí, ¿Qué vas a comparar? Si vas a cotejar byte a byte caracteres, no es necesario hacer conversiones, ya que si, por ejemplo char a='8', a=='8' independientemente de que en la memoria no haya un 8, sino el valor ascii de '8'. Si lo que deseas es obtener el valor 'puro' del dígito para realizar algún cálculo, deberás restar del ascii del dígito el valor ascii del cero, osea int x=a-'0', pero esto no tiene mucho sentido, a no ser que quieras crear una función para convertir varios dígitos en un int, que se haría más o menos así:
int valor;
char digitos[]={'1','7','6','8'};
valor=(digitos[0]-'0')*1000;
valor+=(digitos[1]-'0')*100;
valor+=(digitos[2]-'0')*10;
valor+=(digitos[1]-'0'); // Aquí valor contendría 1768