Ti consiglio di farlo esattamente come hai mostrato, poiché è il più diretto. Inizializza a -1cui funzionerà sempre , indipendentemente dalla rappresentazione del segno reale, mentre ~a volte avrà un comportamento sorprendente perché dovrai avere il giusto tipo di operando. Solo allora otterrai il valore più alto di un unsignedtipo.
Per un esempio di una possibile sorpresa, considera questo:
unsigned long a = ~0u;
Non memorizzerà necessariamente un modello con tutti i bit 1 in a. Ma prima creerà un modello con tutti i bit 1 in un unsigned int, quindi lo assegnerà a a. Quello che succede quando unsigned longha più bit è che non tutti sono 1.
E considera questo, che fallirà nella rappresentazione del complemento di un non-due:
unsigned int a = ~0; // Should have done ~0u !
La ragione di ciò è che ~0deve invertire tutti i bit. Inversione che produrrà -1su una macchina a complemento a due (che è il valore di cui abbiamo bisogno!), Ma non produrrà -1su un'altra rappresentazione. Sulla macchina di un complemento, produce zero. Pertanto, su una macchina del complemento di uno, quanto sopra verrà inizializzato aa zero.
La cosa che dovresti capire è che si tratta di valori, non di bit. La variabile è inizializzata con un valore . Se nell'inizializzatore si modificano i bit della variabile utilizzata per l'inizializzazione, il valore verrà generato in base a tali bit. Il valore necessario, per inizializzare aal valore più alto possibile, è -1o UINT_MAX. Il secondo dipenderà dal tipo di a- dovrai usare ULONG_MAXper un unsigned long. Tuttavia, il primo non dipenderà dal suo tipo ed è un bel modo per ottenere il valore più alto.
Stiamo Non parlando di se -1ha tutti i bit uno (non sempre ha). E non stiamo parlando del fatto che abbia tutti i bit uno (ovviamente ce l'~0 ha).
Ma quello di cui stiamo parlando è il risultato della flagsvariabile inizializzata . E per questo, funzionerà solo-1 con ogni tipo e macchina.