Dal momento che è two's complement, il bit di ordine più alto è usato per il segno. Scrivendo a:4
stai dicendo di allocare solo 4 bit di memoria, che lascia 3 bit rimasti per il numero effettivo. Quindi il nostro intervallo effettivo è [-8,7]
. Poiché tutti gli 1 sono -1, c'è un numero extra sul lato negativo. Per ulteriori informazioni su questo, vedere il link sopra.
9, in (non firmato) binario è: 1001
. Quando lo metti in a
(firmato), ottieni che a
è negativo, a causa della iniziale 1, e poiché i seguenti numeri sono 001
, aggiungiamo 1 al numero negativo massimo, dandoci così -7.
Se si desidera memorizzare il numero 9 in soli 4 bit, è necessario utilizzare uno unsigned int
, che potrebbe fornire un intervallo di [0, 15]
.
EDIT:
Nel caso qualcuno è alle prese con capire come 1001
firmato ci dà -7, considerare quanto segue:
Dal 1111
è -1, lasciare che qualche variabile value = -1
.
Per capire i valori di un negativo (firmata) int num
, indichiamo x i in num
:
x i: {0,1 alla posizione i, con i = 0 è il bit meno significativo)},
Quindi, per ogni x i = 0, sottrarre 2 i da value
.
Esempio:
1001
:
value
= -1 - 2 - 2 = -7
fonte
2013-07-13 17:40:27
Il 'int' in un campo bit potrebbe essere' unsigned int' di default. Sembra non essere nel caso dell'OP, ma non fa mai male leggere la documentazione. –
Bella domanda e risposta molto bella! Ho verificato che il tipo senza segno darà la risposta attesa. – lsk
@ user1930928 Grazie. :) –