Seria definido pela arquitetura que você estava usando. Em um chip Zilog z80 (chip embutido comum), eles teriam um tamanho, enquanto poderiam ter um tamanho totalmente diferente em um chipset x86. No entanto, os tamanhos são proporções fixas entre si. Essencialmente curtos e longos não são tipos, mas se qualificam para o tipo int. Entradas curtas serão uma ordem de magnitude menor que int (regular) e as entradas longas serão uma ordem de magnitude maior. Assim, digamos que seu Int esteja limitado a 4 bytes, o qualificador curto o limita a 4 bytes, embora 2 bytes também seja muito comum e o qualificador longo o potencialize potencialmente para 8 bytes, embora possa ser menor que 4 bytes. Lembre-se de que isso também está sujeito ao tamanho da palavra; portanto, em um sistema de 32 bits, você atingirá o máximo de 4 bytes por int, tornando o mesmo que um int regular. Assim, Curto ≤ Int ≤ Longo.
No entanto, se você prolongá-lo novamente, poderá enviar o int para a próxima célula, fornecendo 8 bytes de armazenamento inteiro. Esse é o tamanho da palavra para máquinas de 64 bits, para que elas não precisem se preocupar com essas coisas e apenas use a célula para polegadas longas, permitindo que elas sejam outra ordem acima das polegadas padrão, enquanto as longas e compridas ficam realmente pequenas.
Quanto à escolha, tudo se resume a algo com que os programadores Java, por exemplo, não precisam se preocupar. "Qual é a sua arquitetura?" Como tudo depende do tamanho da palavra da memória da máquina em questão, você precisa entender isso antes de decidir qual usar. Você escolhe o menor tamanho razoável para economizar o máximo de memória possível, porque essa memória será alocada, independentemente de você usar todos os bits nela ou não. Assim, você salva onde pode e escolhe shorts quando pode e ints quando não pode e se precisar de algo maior do que as ints regulares que você dá; você aumentaria conforme necessário até atingir a palavra teto. Você precisará fornecer rotinas de grande número ou obtê-las de uma biblioteca.
C pode muito bem ser "montagem portátil", mas você ainda precisa conhecer o seu hardware.
<stdint.h>