Domanda

Ho visto questi citati nel contesto di C e C ++, ma qual è la differenza tra variabili con segno e senza segno?

È stato utile?

Soluzione

Variabili firmate , come numeri interi con segno ti consentiranno di rappresentare numeri sia nell'intervallo positivo che negativo .

Variabili non firmate , come numeri interi senza segno, ti consentiranno di rappresentare solo numeri positivi .

Le variabili senza segno e con segno dello stesso tipo (come int e byte) hanno entrambe lo stesso intervallo (intervallo di 65.536 e 256 numeri, rispettivamente), ma senza segno può rappresentare un numero di grandezza maggiore di la corrispondente variabile firmata .

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

La pagina Wikipedia su Rappresentazioni numeriche firmate spiega la differenza nella rappresentazione a livello di bit e la pagina Integer (informatica) fornisce una tabella di intervalli per ogni intero con segno / non firmato tipo.

Altri suggerimenti

Sebbene comunemente indicato come 'bit di segno', i valori binari che usiamo normalmente non hanno un vero bit di segno.

La maggior parte dei computer usa l'aritmetica del complemento a due. I numeri negativi vengono creati prendendo il complemento (capovolgi tutti i bit) e aggiungendo uno:

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


Questo è il motivo per cui un byte con segno contiene valori da -128 a +127 anziché da -127 a +127:

nbsp &; Nbsp &; Nbsp &; Nbsp &; Nbsp &; Nbsp &; 1 0 0 0 0 0 0 0 = -128
nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; 1 0 0 0 0 0 0 1 = -127
nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; - - -
nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; 1 1 1 1 1 1 1 0 = -2
nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; 1 1 1 1 1 1 1 1 = -1
nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; 0 0 0 0 0 0 0 0 = 0
nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; 0 0 0 0 0 0 0 1 = 1
nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; 0 0 0 0 0 0 1 0 = 2
nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; - - -
nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; 0 1 1 1 1 1 1 0 = 126
nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; 0 1 1 1 1 1 1 1 = 127
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; (aggiungi da 1 a 127 dà :)
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1 0 0 0 0 0 0 0 & nbsp; & nbsp; & nbsp; che noi vedere 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) perché un bit è riservato per il segno. Se il bit più significativo è il bit di segno, avremmo:

nbsp &; Nbsp &; Nbsp &; Nbsp &; Nbsp &; Nbsp &; -5 (decimal) -> 10000101 (binary)
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0 (decimal) -> 00000000 (binary)

La cosa interessante in questo caso è che abbiamo sia uno zero che uno zero:
nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; -0 (decimal) -> 10000000 (binary)
nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; nbsp &; <=>


Non abbiamo -0 con il complemento a due; quello che sarebbe -0 è -128 (o, per essere più generale, uno in più del più grande valore positivo). Facciamo con il proprio complemento però; tutti i 1 bit sono negativi 0.

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

Le variabili firmate usano un bit per contrassegnare se sono positive o negative. Le variabili senza segno non hanno questo bit, quindi possono memorizzare numeri più grandi nello stesso spazio, ma solo numeri non negativi, ad es. 0 e versioni successive.

Per ulteriori informazioni: Numeri interi non firmati e firmati

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

Questa abilità è chiamata 'segno' o 'bit di firma'.

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

Le variabili firmate possono essere 0, positive o negative.

Le variabili non firmate possono essere 0 o positive.

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

unsigned viene utilizzato quando il tuo valore deve essere positivo, nessun valore negativo qui, se firmato per int range da -32768 a +32767 se non firmato per int range da 0 a 65535

Variabili non firmate sono variabili che sono rappresentate internamente senza un segno matematico (più o meno) possono memorizzare solo 'zero' o valori positivi . Supponiamo che la variabile senza segno abbia dimensioni n bit , quindi possa rappresentare 2 ^ n (2 potenze n) valori da 0 a (2 ^ n -1). D'altra parte, una variabile con segno "perde" un bit per rappresentare il segno, quindi può memorizzare valori compresi tra - (2 ^ (n-1) -1) e (2 ^ (n-1)) incluso zero. Pertanto, una variabile con segno può memorizzare valori positivi, valori negativi e zero .

P.S:.
Internamente, il segno matematico può essere rappresentato nella sua forma di complemento, in una forma di complemento di due o con un bit di segno (ad esempio: 0 - & Gt; +, 1 - & Gt; -)
Tutti questi metodi dividono efficacemente l'intervallo di valori rappresentabili in n bit (2 ^ n) in tre parti, positivo, negativo e zero.

Questo vale solo i miei due centesimi.

Spero che questo aiuti.

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 esiste un ampio spazio per i numeri casuali poiché i numeri con segno danno sia numeri positivi che negativi. Poiché l'ora del sistema non può essere negativa, utilizziamo una variabile senza segno (solo numeri positivi) e abbiamo un intervallo più ampio di numeri casuali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top