2009-03-07 12 views
48

Ho visto questi menzionati nel contesto di C e C++, ma qual è la differenza tra variabili firmate e non firmate?Qual è la differenza tra variabili firmate e non firmate?

+0

Ho pensato di assumere in programmazione per impostazione predefinita e non quando taggato non correlato alla programmazione? –

+0

Anch'io. Ho trovato alcune domande in programmazione. Mi chiedo perché? – batbrat

+0

La domanda riguarda un aspetto specifico della programmazione in generale. – Sam152

risposta

102

variabili Firmata, come interi con segno vi permetterà di rappresentare i numeri sia nelle gamme positivi e negativi.

variabili Unsigned, come interi senza segno, saranno solo consentirà di rappresentare i numeri in positivo.

variabili firmati e firmate dello stesso tipo (ad esempio int e byte) entrambi hanno la stessa gamma (gamma di 65.536 e 256 numeri, rispettivamente), ma senza segno può rappresentare un numero grandezza superiore alla corrispondente firmata variabile .

Ad esempio, un unsigned byte può rappresentare i valori da 0 a 255, mentre signed byte può rappresentare -128 a 127.

pagina Wikipedia su Signed number representations spiega la differenza nella rappresentazione a livello di bit e la pagina Integer (computer science) fornisce una tabella di intervalli per ogni tipo di intero con segno/senza segno.

+0

I numeri positivi sono maggiori di zero. I numeri firmati, almeno in C, possono utilizzare un bit di segno piuttosto che una rappresentazione di complemento, quindi non hanno lo stesso intervallo di unsigned a causa di ripetuti +/- zero. Se dici che un int è 16 bit, dì la piattaforma; i sistemi più moderni sono 32 o 64 bit. –

18

Le variabili firmate utilizzano un bit per indicare se sono positive o negative. Le variabili unsigned non hanno questo bit, quindi possono memorizzare numeri più grandi nello stesso spazio, ma solo numeri non negativi, ad es. 0 e oltre.

Per maggiori: Unsigned and Signed Integers

+0

s/positivo/non negativo/ – Ken

+0

Sì, corretto per rendere più chiaro. –

+0

grazie, dopo 2 minuti di ricerca su google, questa era la mia risposta preferita per chiarire per me – SheldonH

3

Le variabili non firmate possono essere solo numeri positivi, perché non hanno la capacità di indicare che sono negative.

Questa capacità è denominata "segno" o "bit di firma".

Un effetto collaterale è che senza un bit di firma, hanno un altro bit che può essere utilizzato per rappresentare il numero, raddoppiando il numero massimo che può rappresentare.

3

Le variabili firmate possono essere 0, positive o negative.

Le variabili senza segno possono essere 0 o positive.

Le variabili senza segno vengono utilizzate a volte perché è possibile utilizzare più bit per rappresentare il valore effettivo. Dandoti una gamma più ampia. Inoltre, puoi garantire che un valore negativo non venga passato alla tua funzione, ad esempio.

variabili
0

firmati sono variabili rappresentato internamente senza segno matematico (più o meno) può memorizzare 'zero' o valori positivi. Diciamo che la variabile unsigned è n bit in dimensioni, quindi può rappresentare 2^n (2 potenza n) valori da 0 a (2^n -1). D'altra parte, una variabile firmata "perde" un bit per rappresentare il segno, quindi può memorizzare valori da - (2^(n-1) -1) a (2^(n-1)) compreso zero.Pertanto, una variabile firmata può memorizzare valori positivi , valori negativi e zero.

PS:
Internamente, il segno matematico può essere rappresentata nella propria forma di complemento, modulo di complemento a due o con un bit di segno (per esempio: 0 -> +, 1-> -)
Tutti questi metodi in modo efficace dividere l'intervallo di valori rappresentabili in n bit (2^n) in tre parti, positivo, negativo e zero.

Questo è solo il mio valore di due centesimi.

Spero che questo aiuti.

2

senza segno viene usato quando ur valore deve essere positivo, nessun valore negativo qui, se firmato per gamma int -32768 a +32767 se senza segno per gamma int 0 a 65535

37

Mentre comunemente indicato come un ' sign bit ', i valori binari che usiamo di solito non hanno un bit di segno vero.

La maggior parte dei computer utilizza l'aritmetica a complemento a due.I numeri negativi sono creati prendendo il provare le proprie-complemento (capovolgere tutti i bit) e l'aggiunta di uno:

            5 (decimal) -> 00000101 (binary)
            1's complement: 11111010
            add 1: 11111011 which is 'FB' in hex


Questo è il motivo per un byte con segno detiene i valori da -128 a +127, invece di -127 a +127:

            1 0 0 0 0 0 0 0 = -128
            1 0 0 0 0 0 0 1 = -127
                    - - -
            1 1 1 1 1 1 1 0 = -2
            1 1 1 1 1 1 1 1 = -1
            0 0 0 0 0 0 0 0 = 0
            0 0 0 0 0 0 0 1 = 1
            0 0 0 0 0 0 1 0 = 2
                    - - -
            0 1 1 1 1 1 1 0 = 126
            0 1 1 1 1 1 1 1 = 127
            (aggiungere 1 a 127 dà :)
            1 0 0 0 0 0 0 0       cui si vede nella parte superiore di questo grafico è -128.

Se avessimo un bit di segno corretto, l'intervallo di valori sarebbe lo stesso (ad esempio da -127 a +127) poiché un bit è riservato per il segno. Se il più significativo bit è il bit di segno, avremmo:

            5 (decimal) -> 00000101 (binary)
            -5 (decimal) -> 10000101 (binary)

La cosa interessante in questo caso è che abbiamo sia uno zero sia uno zero negativo:
            0 (decimal) -> 00000000 (binary)
            -0 (decimal) -> 10000000 (binary)


Non abbiamo -0 con complemento a due; cosa sarebbe -0 è -128 (o per essere più generale, uno in più del più alto valore positivo). Facciamo però con il complemento; tutti 1 bit è negativo 0.

Matematicamente, -0 è uguale a 0. Ricordo vagamente un computer in cui -0 < 0, ma non riesco a trovare alcun riferimento ad esso ora.

+3

Grazie mille! Ero davvero confuso perché è da -128 a 127 per un byte firmato e non da -127 a 127. Questa risposta richiede più voti! –

-1

Questa potrebbe non essere la definizione esatta ma ti darò un esempio: Se dovessi creare un numero casuale prendendolo dall'ora di sistema, qui usare la variabile non firmata è vantaggioso in quanto vi è ampio margine per random numeri come numeri firmati danno numeri sia positivi che negativi. Poiché il tempo di sistema non può essere negativo, utilizziamo una variabile senza segno (solo numeri positivi) e abbiamo una gamma più ampia di numeri casuali.

Problemi correlati