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ção

Além disso, o tamanho dechar&nbsp;é descrito por 3.9.1 / como sendo:

[...] grande o suficiente para armazenar qualquer membro do conjunto de caracteres básico da implementação.

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&nbsp;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&nbsp;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&nbsp;pode acomodar para serLONG_MIN-LONG_MAX 2

Portanto, não importa o tamanholong&nbsp;é, ele deve ser grande o suficiente para armazenar LONG_MIN e LONG_MAX.

Mas Alf e outros sãoespecífico&nbsp;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&nbsp;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>&nbsp;Como:

LONG_MIN -2147483647 // -(2^31 - 1)
LONG_MAX +2147483647 //   2^31 - 1