The best source is the C# specification, specifically section Literals.
The relevant bits:
The type of an integer literal is determined as follows:
- If the literal has no suffix, it has the first of these types in which its value can be represented:
int,uint,long,ulong.- If the literal is suffixed by U or u, it has the first of these types in which its value can be represented:
uint,ulong.- If the literal is suffixed by L or l, it has the first of these types in which its value can be represented:
long,ulong.- If the literal is suffixed by UL, Ul, uL, ul, LU, Lu, lU, or lu, it is of type
ulong.If no real_type_suffix is specified, the type of the real literal is
double. Otherwise, the real type suffix determines the type of the real literal, as follows:
A real literal suffixed by F or f is of type
float. […]A real literal suffixed by D or d is of type
double. […]A real literal suffixed by M or m is of type
decimal. […]
That means the letter (or letters) is called “suffix”. There is no way to represent short this way, so you have to use (short)0, or just short x = 0;.