O tamanho de bytes para tipos não é muito interessante quando você precisa lidar apenas com um único idioma (e para o código que você não precisa se lembrar sobre estouros de matemática). A parte que se torna interessante é quando você faz a ponte entre um idioma para outro, C # para objeto COM, etc., ou está fazendo alguma alteração ou mascaramento de bits e precisa se lembrar (e seus colegas de revisão de código) do tamanho dos dados.
Na prática, normalmente uso o Int32 apenas para me lembrar qual é o tamanho deles, porque escrevo C ++ gerenciado (para fazer a ponte para C # por exemplo), bem como C ++ nativo / não gerenciado.
Desde que você provavelmente saiba, em C # é de 64 bits, mas em C ++ nativo, ele termina em 32 bits ou char é unicode / 16 bits, enquanto em C ++ é de 8 bits. Mas como sabemos disso? A resposta é, porque nós procuramos no manual e ele disse isso.
Com o tempo e as experiências, você começará a ter mais consciência do tipo quando escrever códigos para fazer a ponte entre C # e outras línguas (alguns leitores aqui estão pensando "por que você faria isso?"), Mas IMHO acredito que é uma prática melhor porque Não me lembro do que codifiquei na semana passada (ou não preciso especificar no meu documento da API que "esse parâmetro é um número inteiro de 32 bits").
No F # (embora eu nunca o tenha usado), eles definem int , int32 e nativeint . A mesma pergunta deve surgir: "qual deles eu uso?". Como outros já mencionaram, na maioria dos casos, isso não deve importar (deve ser transparente). Mas eu escolheria int32 e uint32 apenas para remover as ambiguidades.
Eu acho que dependeria apenas de quais aplicativos você está codificando, quem está usando, quais práticas de codificação você e sua equipe seguem etc. para justificar quando usar o Int32.