Eu recomendo que você faça exatamente como demonstrou, pois é o mais direto. Inicialize para o -1qual sempre funcionará , independentemente da representação real do sinal, enquanto ~às vezes terá um comportamento surpreendente, pois você precisará ter o tipo certo de operando. Somente então você obterá o valor mais alto de um unsignedtipo.
Para um exemplo de uma possível surpresa, considere este:
unsigned long a = ~0u;
Não necessariamente armazenará um padrão com todos os bits 1 a. Mas ele primeiro criará um padrão com todos os bits 1 em um unsigned inte depois o atribuirá a. O que acontece quando unsigned longhá mais bits é que nem todos são 1.
E considere este, que falhará na representação do complemento de um não-dois:
unsigned int a = ~0; // Should have done ~0u !
A razão para isso é que ~0é necessário inverter todos os bits. Invertendo que irá produzir -1na máquina de complemento de dois (que é o valor que precisamos!), Mas não deu -1em outra representação. Na máquina de complemento de uma pessoa, ela produz zero. Assim, na máquina de complemento de uma pessoa, o acima será inicializado acomo zero.
O que você deve entender é que se trata de valores - não de bits. A variável é inicializada com um valor . Se no inicializador você modificar os bits da variável usada para inicialização, o valor será gerado de acordo com esses bits. O valor que você precisa, para inicializar acom o maior valor possível, é -1ou UINT_MAX. O segundo dependerá do tipo de a- você precisará usar ULONG_MAXpara um unsigned long. No entanto, o primeiro não dependerá do seu tipo e é uma ótima maneira de obter o valor mais alto.
Estamos não falar sobre se -1tem todos os bits um (que nem sempre tem). E nós estamos não falar sobre se ~0tem todos os bits um (ele tem, é claro).
Mas o que estamos falando é qual é o resultado da flagsvariável inicializada . E, para isso, apenas-1 funcionará com todos os tipos e máquinas.