Ti consiglio di farlo esattamente come hai mostrato, poiché è il più diretto. Inizializza a -1
cui 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 unsigned
tipo.
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 long
ha 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 ~0
deve invertire tutti i bit. Inversione che produrrà -1
su una macchina a complemento a due (che è il valore di cui abbiamo bisogno!), Ma non produrrà -1
su un'altra rappresentazione. Sulla macchina di un complemento, produce zero. Pertanto, su una macchina del complemento di uno, quanto sopra verrà inizializzato a
a 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 a
al valore più alto possibile, è -1
o UINT_MAX
. Il secondo dipenderà dal tipo di a
- dovrai usare ULONG_MAX
per 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 -1
ha 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 flags
variabile inizializzata . E per questo, funzionerà solo-1
con ogni tipo e macchina.