2013-07-13 15 views

risposta

5

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

+0

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. –

+0

Bella domanda e risposta molto bella! Ho verificato che il tipo senza segno darà la risposta attesa. – lsk

+0

@ user1930928 Grazie. :) –

3

Si sono riservati solo 4 bit per il campo, un bit è utilizzato per il segno, quindi rimangono solo 3 bit per i valori positivi. Quindi puoi memorizzare solo valori fino a 7.

+2

potrebbe u spiegare usando rappresentazione binaria? –

+0

@RajaNarayan controlla la mia risposta. –

+0

@SteveP. Grazie per la spiegazione! –

4

Il tuo campo è un intero con segno a 4 bit. Per gli interi con segno il bit superiore è un bit di segno, il che significa che hai solo 3 bit per il numero effettivo. L'intervallo di numeri che è possibile memorizzare nel campo è compreso tra -8 e 7 (presupponendo la memoria di complimento di 2).

Il modello di bit per 9 è 1001, che ha il 4 ° bit impostato, il che significa che è interpretato come un numero negativo, motivo per cui viene stampato come -7. Se ti saresti aspettato un -1, devi leggere su 2's compliment.

Se si vuole essere in grado di memorizzare 9 nel campo, fare a un unsigned int

2

è necessario utilizzare unsigned infatti int:

#include<stdio.h> 
struct a 
{ 
    unsigned a:4; // <-- unsigned indeed int, then work good 
}; 
main(){ 
struct a aa; 
aa.a=9; 
printf("a=%d\n",aa.a); 
return 0; 
} 

uscita:

a=9 
Problemi correlati