Eu recomendo que você faça exatamente como demonstrou, pois é o mais direto. Inicialize para o -1
qual 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 unsigned
tipo.
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 int
e depois o atribuirá a
. O que acontece quando unsigned long
há 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 -1
na máquina de complemento de dois (que é o valor que precisamos!), Mas não deu -1
em 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 a
como 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 a
com o maior valor possível, é -1
ou UINT_MAX
. O segundo dependerá do tipo de a
- você precisará usar ULONG_MAX
para 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 -1
tem todos os bits um (que nem sempre tem). E nós estamos não falar sobre se ~0
tem todos os bits um (ele tem, é claro).
Mas o que estamos falando é qual é o resultado da flags
variável inicializada . E, para isso, apenas-1
funcionará com todos os tipos e máquinas.