long
e long int
são idênticos. Então são long long
e long long int
. Nos dois casos, oint
é opcional.
Quanto à diferença entre os dois conjuntos, o padrão C ++ exige intervalos mínimos para cada um, e que long long
é pelo menos tão amplo quantolong
.
As partes de controle do padrão (C ++ 11, mas isso já existe há muito tempo) são, por um lado 3.9.1 Fundamental types
, a seção 2 (uma seção posterior fornece regras semelhantes para os tipos integrais não assinados):
Existem cinco tipos de números inteiros assinados padrão: char assinado, int curto, int, int longo e int long long. Nesta lista, cada tipo fornece pelo menos a quantidade de armazenamento que os anteriores à lista.
Há também uma tabela 9 7.1.6.2 Simple type specifiers
, que mostra os "mapeamentos" dos especificadores para tipos reais (mostrando que int
é opcional), cuja seção é mostrada abaixo:
Specifier(s) Type
------------- -------------
long long int long long int
long long long long int
long int long int
long long int
Observe a distinção existente entre o especificador e o tipo. O especificador é como você diz ao compilador qual é o tipo, mas você pode usar diferentes especificadores para terminar no mesmo tipo.
Portanto, long
por si só, não é um tipo nem um modificador, como sugere sua pergunta, é simplesmente um especificador para o long int
tipo. O mesmo vale por long long
ser um especificador para olong long int
tipo.
Embora o próprio padrão C ++ não especifique os intervalos mínimos de tipos integrais, ele cita C99, in 1.2 Normative references
, como aplicável. Portanto, os intervalos mínimos, conforme estabelecido em, C99 5.2.4.2.1 Sizes of integer types <limits.h>
são aplicáveis.
Em termos de long double
, na verdade, é um valor de ponto flutuante em vez de um número inteiro. Da mesma forma que os tipos integrais, é necessário ter pelo menos tanta precisão quanto double
ae fornecer um superconjunto de valores sobre esse tipo (significando pelo menos esses valores, não necessariamente mais valores).