In languages like C you need to specify what data type each variable is. int is perhaps the most common data type, but it comes in several flavors. In increasing size (well, non-decreasing actually) these are char, short int, int, long int and long long int. Typically char is 8-bits, short int 16-bits, int 32-bit, long int 64-bits and long long int 128-bits.
In addition to describing the size of an integer you also get to describe the representation used, signed or unsigned. Both signed and unsigned representations can store the same number of different values, but in the signed form half of these are negative. So an 8-bit char can hold 256 different values, in it's unsigned version these will be 0 through to 255, in it's signed version -128 through to 127.
Most of the types can be abbreviated, so "signed long int" can be abbreviated to "long". All the types if you don't say "unsigned" it is assumed to be signed, and you don't have to say "int" unless all you want is a plain signed int. Except for char, depending on your compiler char can be either signed or unsigned and these days (since the demise of ASCII) most compilers see "char" as "unsigned char".
chars are just a type of int, however they have a special use. They are used to represent text. Each letter and symbol is assigned a numeric value, so A is 65, B is 66, etc. You can then write text by stringing these together.
char == unsigned char == 0..255
unsigned char == -128..127
short == signed short == signed short int == -32768..32767
unsigned short == unsigned short int == 0..65535
int == signed int == large negative number to large positive number
unsigned == unsigned int == 0 to doubly large positive number
etc