O `long` tem garantia de pelo menos 32 bits?
Pela minha leitura do padrão C ++, sempre entendi que os tamanhos dos tipos fundamentais integrais em C ++ eram os seguintes:
sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
Deduzi isso de 3.9.1 / 2:
Existem quatro tipos de números inteiros assinados: “char assinado”, “int curto”, “int” e “int longo”. Nesta lista, cada tipo fornece pelo menos tanto armazenamento quanto os que o precedem na lista. Ints simples têm o tamanho natural sugerido pela arquitetura do ambiente de execuçãoAlém disso, o tamanho dechar
é descrito por 3.9.1 / como sendo:
1.7 / 1 define isso em termos mais concretos:
A unidade de armazenamento fundamental no modelo de memória C ++ é o byte. Um byte é pelo menos grande o suficiente para conter qualquer membro do conjunto de caracteres de execução básica e é composto por uma sequência contígua de bits, cujo número é definido pela implementação.Isso me leva à seguinte conclusão:
1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
Ondesizeof
nos diz quantos bytes o tipo é. Além disso, é definido pela implementação quantos bits existem em um byte. A maioria de nós provavelmente está acostumada a lidar com bytes de 8 bits, mas o Padrão diz que existemn
bits em um byte.
Noesta postagem, Alf P. Steinbach diz:
long é garantido (pelo menos) 32 bits.
Isso vai contra tudo o que entendo o tamanho dos tipos fundamentais em C ++, de acordo com o Padrão. Normalmente, eu apenas desconsideraria esta afirmação como iniciante, mas, como era Alf, decidi que valia a pena investigar mais.
Então, o que você diz? Há um tempo garantido pelo padrão em pelo menos 32 bits? Em caso afirmativo, seja específico sobre como essa garantia é feita. Eu simplesmente não vejo isso.
O padrão C ++ diz especificamente que, para conhecer C ++, você deve conhecer C (1.2 / 1)1
O padrão C ++ define implicitamente o limite mínimo dos valores que umlong
pode acomodar para serLONG_MIN
-LONG_MAX
2
Portanto, não importa o tamanholong
é, ele deve ser grande o suficiente para armazenar LONG_MIN e LONG_MAX.
Mas Alf e outros sãoespecífico que um longo deve ter pelo menos 32 bits. É isso que estou tentando estabelecer. O padrão C ++ é explícito que o número de bits em um byte não é especificado (pode ser 4, 8, 16, 42). Como a conexão é feita para poder acomodar os númerosLONG_MIN-LONG_MAX
ter pelo menos 32 bits?
(1) 1.2 / 1: Os seguintes documentos referenciados são indispensáveis para a aplicação deste documento. Para referências datadas, apenas a edição citada se aplica. Para referências sem data, aplica-se a edição mais recente do documento mencionado (incluindo quaisquer alterações).
ISO / IEC 2382 (todas as partes), Tecnologia da informação - VocabulárioISO / IEC 9899: 1999, linguagens de programação - CISO / IEC 10646-1: 2000, Tecnologia da informação - Conjunto Universal de Caracteres Codificados com Vários Octetos (UCS) - Parte 1: Arquitetura e Plano Multilíngue Básico(2) Definido em<climits>
Como:
LONG_MIN -2147483647 // -(2^31 - 1)
LONG_MAX +2147483647 // 2^31 - 1