2009-02-24 10 views

risposta

25

Si tratta di un problema di tipo. Se lanci il 0 a unsigned andrà tutto bene:

unsigned mask = ~ (unsigned) 0 >> 1; 
printf("%u\n", mask); 

Edit per commenti: o utilizzare la notazione letterale non firmato, che è molto più succinta. :)

unsigned mask = ~0u >> 1; 
printf("%u\n", mask); 
+2

Oppure: "maschera senza segno = ~ 0u >> 1;" Il suffisso u indica un numero intero senza segno. – Skizz

+0

Ah si, anche quello. – chaos

+1

Bingo! Questa domanda è stata difficile per me perché non ero a conoscenza del tipo implicito di fusione in corso. Le risposte precedenti non lo rendevano chiaro. –

13

Sign extension

Quello che sta succedendo è ~0 è un int con tutti i bit impostati (-1). Ora hai il diritto di passare da 1; dal momento che è -1, l'estensione di segno mantiene il bit più alto impostato in modo che rimanesse segnato (non è quello che ti aspettavi). Quindi viene convertito in unsigned come previsto.

2

~ 0 è una stringa di uno. L'operatore >> li sposta e, in un valore firmato, sposta quelli nei bit di ordine superiore. Quindi puoi cambiare tutto quello che vuoi, il risultato non cambierà.

4

Prova questa:

unsigned mask = (unsigned) ~0 >> 1; 
printf("%08x\n", mask); 

Il RHS della cessione viene trattato come quantità firmato a meno che la lanci, il che significa che stavano vedendo estensione del segno, senza il cast. (Ho anche modificato la dichiarazione di stampa per visualizzare il numero in esadecimale, che è più facile da decodificare.)

Problemi correlati