2016-04-11 84 views
5

Questa dovrebbe essere una domanda abbastanza semplice, ma non riesco a trovare la risposta nel mio libro di testo e non riesco a trovare le parole chiave giuste per trovarlo online.Cosa succede quando applico l'operatore unario "-" a un numero intero senza segno?

Che cosa significa quando si dispone di un segno negativo davanti a un int unsigned?

In particolare, se x è un numero intero senza segno uguale a 1, qual è il valore di bit di -x?

+1

In particolare, il valore del bit sarà lo stesso, indipendentemente dal fatto che la variabile sia dichiarata come int signed o unsigned. Solo l'interpretazione cambia; il valore binario sottostante non lo fa. – Amadan

+0

https://repl.it/CEPW/2 –

+0

Si ottiene l'unico numero tale che 'x + (-x) = x - x = 0', quindi, l'unico risultato ragionevole. – harold

risposta

10

Per lo standard C, l'aritmetica per interi senza segno viene eseguita modulo 2 larghezza bit. Così, per un intero a 32 bit, la negazione sarà presa mod 2 = 4294967296.

Per un numero a 32 bit, quindi, il valore che si otterrà se si nega un numero n sta per essere 0-n = 4294967296-n. Nel tuo caso specifico, supponendo che unsigned int abbia una larghezza di 32 bit, otterrai 4294967296-1 = 4294967295 = 0xffffffff (il numero con tutti i bit impostati).


Il testo rilevante nello standard C è in §6.2.5/9:

un risultato che non può essere rappresentato dal tipo intero senza segno risultante viene ridotta modulo il numero che è maggiore di uno rispetto al valore più grande che può essere rappresentato dal tipo risultante

+0

Dettaglio: "viene eseguito modulo larghezza 2 bit" è più esattamente indicato con "viene eseguito modulo (valore max + 1)". Una differenza nel raro caso di un intero senza segno contenente bit di riempimento. (Qualcosa che non ho mai visto.) – chux

4

sarà trabocco nella direzione negativa, cioè se il int è 16 bit x sarà 65535. Il valore di bit sarà 1111111111111111 (16 quelli)

Se int è di 32 bit, x sarà 4294967295

0

quando si applica il "-", l'equipaggio della Due del numero intero viene memorizzato nella variabile. vedi here per dettagli

+2

Questo è davvero cercando di spiegarlo nel modo sbagliato. L'aritmetica senza segno è modulo e il complemento a due è la rappresentazione del segno che usa questo semplice trucco. –

+0

int V1 = -1; unsigned int V2 = -1; il valore memorizzato per V1 e V2 in memoria è 0xffffffff che è il complemento a due di 0x00000001. – Afshin