2010-09-28 24 views
27

considerare queste definizioni:Qual è la differenza tra unsigned int e signed int in C?

int x=5; 
int y=-5; 
unsigned int z=5; 

Come sono memorizzati nella memoria? Qualcuno può spiegare la rappresentazione bit di questi in memoria?

Can int x=5 e int y=-5 hanno la stessa rappresentazione di bit in memoria?

+0

Questa domanda potrebbe richiedere un capitolo da elaborare. Se vuoi conoscere i dettagli, controlla [Numeri interi non firmati e firmati] (http://kias.dyndns.org/comath/13.html) per ulteriori spiegazioni. – anonymous

risposta

3

Ecco il link molto bello che spiega lo stoccaggio di INT firmato e non firmato in C -

http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O

Tratto da questo precedente articolo -

"processo chiamato complemento a due viene utilizzato per trasformare numeri positivi in ​​numeri negativi L'effetto collaterale di questo è che il bit più significativo è usato per dire al computer se il numero è positivo o negativo.Se il bit più significativo è un 1, allora il numero è negativo.Se è 0, il numero è positivo. "

+0

ok sul compilatore a 16 bit puoi dirmi come int x = 5 e int y = -5 memorizzano internamente in memoria. Si prega di fornire la rappresentazione bit –

+6

Si noti che il complemento a 2 non è l'unica rappresentazione firmata consentita per un'implementazione C - sono inoltre consentiti sia il complemento che la grandezza del segno. – caf

0

Supponendo int è un intero a 16 bit (che dipende dall'implementazione C, la maggior parte sono 32 bit oggi) rappresentazione dei bit differisce come la seguente:

5 = 0000000000000101 
-5 = 1111111111111011 

se binario 1111111111111011 sarebbe impostato a un int non firmato , sarebbe decimale 65531.

+6

ISO C fa _non_ mandare la rappresentazione del complemento a 2, a proposito. – paxdiablo

+0

ok sul compilatore a 16 bit puoi dirmi come int x = 5 e int y = -5 memorizzano internamente in memoria. Si prega di fornire la rappresentazione bit –

+0

@Anand: cosa vuoi veramente? c'è già la rappresentazione dei bit (in complemento a due) nella risposta. –

4

Il C standard specifica che i numeri non firmati verranno memorizzati in binario. (Con i bit di riempimento opzionali). I numeri firmati possono essere memorizzati in uno dei tre formati: Magnitudine e segno; complemento a due o complemento a uno. È interessante notare che esclude alcune altre rappresentazioni come Excess-n or Base −2.

Tuttavia sulla maggior parte delle macchine e dei compilatori archiviano i numeri firmati in complemento a 2.

int è normalmente 16 o 32 bit. Lo standard dice che int dovrebbe essere quello che è più efficiente per il processore sottostante, purché sia ​​>= short e <= long quindi consentito dallo standard.

Su alcune macchine e la cronologia del sistema operativo ha causato il fatto che int non è la dimensione migliore per l'iterazione corrente dell'hardware.

+0

ok sul compilatore a 16 bit puoi dirmi come int x = 5 e int y = -5 memorizzano internamente in memoria. Si prega di fornire la rappresentazione bit –

+0

-1: Purtroppo la risposta è sbagliata. C prescrive in modo molto preciso come devono essere rappresentati gli interi. In particolare per i tipi non firmati non c'è molta scelta per un'implementazione del compilatore. Ma anche per i tipi firmati lo standard è abbastanza restrittivo. E 'int' non è in alcun modo il tipo più efficiente per il processore. Nella maggior parte dei casi è attualmente bloccato con 32 bit (solo per ragioni sintattiche di ogni altra cosa), dove il più efficiente è spesso 64. –

+0

@Jens Gustedt: "Sfortunatamente", la risposta di Douglas è molto corretta. Lo standard non discrimina tra complemento a due, complemento o grandezza firmata, ma stabilisce solo che le rappresentazioni positive delle firme firmate devono essere identiche alla rappresentazione degli stessi valori in termini di unsigned. Lo standard afferma inoltre che "un oggetto 'plain' ** int ** ha le dimensioni naturali suggerite dall'architettura dell'ambiente di esecuzione".Quelle implementazioni hanno rovinato tutto questo non è colpa della lingua. Douglas è assolutamente corretto, quindi do +1 per compensare il tuo -1. – DevSolar

37

ISO C indica quali sono le differenze.

Il tipo di dati int è firmato e presenta un intervallo minimo compreso tra -32767 e 32767 inclusi. I valori effettivi sono indicati in e INT_MAX rispettivamente.

Un unsigned int ha un intervallo minimo compreso tra 0 e 65535, con il valore massimo effettivo pari a UINT_MAX da quello stesso file di intestazione.

Oltre a ciò, lo standard non richiede due notazioni complementari per la codifica dei valori, questa è solo una delle possibilità.I tre tipi consentiti avrebbero codifiche di quanto segue per 5 e -5 (utilizzando i tipi di dati a 16 bit):

 two's complement | ones' complement | sign/magnitude 
    +---------------------+---------------------+---------------------+ 
5 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 
-5 | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101 | 
    +---------------------+---------------------+---------------------+ 
  • In complemento a due, si ottiene un negativo di un numero invertendo tutti i bit aggiungendo poi 1.
  • Nel complemento di uno, si ottiene un numero negativo di un numero invertendo tutti i bit.
  • Nel segno/grandezza, il bit alto è il segno quindi basta invertire che per ottenere il negativo.

Si noti che i valori positivi hanno la stessa codifica per tutte le rappresentazioni, solo i valori negativi sono diversi.

Nota inoltre che, per i valori senza segno, non c'è bisogno di usare uno dei bit per il segno. Ciò significa che ottieni un raggio maggiore sul lato positivo (ovviamente senza codifiche negative).

E no, 5 e -5 non possono avere la stessa codifica indipendentemente dalla rappresentazione utilizzata. Altrimenti, non ci sarebbe modo di dire la differenza.

+3

Tuttavia, impone una scelta del complemento a 2, del complemento o della grandezza del segno. – caf

+0

Un'implementazione conforme utilizza la stessa rappresentazione per i numeri con segno e senza segno e impone semplicemente che il bit di segno sia '0' per le operazioni sui tipi dichiarati 'senza segno' (in modo che sia essenzialmente un 'bit di riempimento')? – supercat

+0

Forse, penso che possa essere permesso ma, poiché l'intervallo minimo è 0-65536, avresti bisogno di almeno 17 bit per quello schema. Ciò conterrebbe numeri interi senza segno a 16 bit ma probabilmente andrà bene con numeri interi a 32 bit. Non ne sono sicuro, dal momento che non ho esaminato attentamente se l'involucro di unsigned sia specificato dall'ISO, ma sembra inefficiente/dispendioso per il raccolto attuale di CPU, almeno. – paxdiablo

2

Perché è tutto solo sulla memoria, alla fine tutti i valori numerici sono memorizzati in formato binario.

Un numero intero senza segno a 32 bit può contenere valori da 0 binari a tutti 1 binari.

Quando si tratta di 32 bit con segno intero, significa uno dei suoi bit (più significativi) è un flag che indica il valore di essere positivo o negativo.

+0

Puoi dirmi in questo caso come controllare se il valore dato a un s8 (firmato a 8 bit) se è fuori portata o no. Devo confrontare il valore con 0x7F invece di 0xFF? E dovrei controllare prima il bit del segno? Grazie –

Problemi correlati