2013-09-01 28 views
13

Perché l'intervallo di qualsiasi tipo di dati è maggiore sul lato negativo rispetto al lato positivo?Perché l'intervallo di int è compreso tra -32768 e 32767?

Ad esempio, in caso di numero intero:

In Turbo C sua gamma è -32768 a 32767 e per Visual Studio è -2147483648 a 2147483647.

Lo stesso accade per altri tipi di dati ...

[UPD: Impostare i valori limite per Visual Studio]

+4

Dove metteresti zero? – Shomz

+16

http://en.wikipedia.org/wiki/Two's_complement –

+0

Perché devi salvare anche 0! – GC268DM

risposta

31

A causa di come i numeri sono memorizzati i numeri con segno vengono memorizzati utilizzando qualcosa chiamato "notazione complemento a due"

Ricordare che tutte le variabili hanno una certa quantità di bit Se il più significativo di essi, quello a sinistra, è uno 0, il numero è non negativo (cioè, positivo o zero), e il resto dei bit rappresenta semplicemente il valore

Tuttavia, se il bit più a sinistra è un 1, il numero è negativo.Il valore reale del numero può essere ottenuto da sottrarre ting 2^n dall'intero numero rappresentato (come una quantità senza segno, incluso il più a sinistra 1), dove n è la quantità di bit della variabile.

Poiché sono rimasti solo n - 1 bit per il valore attuale (la "mantissa") del numero, le combinazioni possibili sono 2^(n - 1). Per numeri positivi/zero, questo è facile: vanno da 0, a 2^(n - 1) - 1. Quel -1 è quello di rendere conto dello zero stesso - per esempio, se tu avessi solo quattro combinazioni possibili, quelle combinazioni rappresenterebbe 0, 1, 2 e 3 (nota come ci sono quattro numeri): va da 0 a 4 - 1.

Per i numeri negativi, ricorda che il bit più a sinistra è 1, quindi l'intero numero rappresentato va da 2^(n - 1) e (2^n) - 1 (le parentesi sono molto importanti lì!). Tuttavia, come ho detto, devi prendere 2^n per ottenere il valore reale del numero. 2^(n - 1) - 2^n è - (2^(n - 1)) e ((2^n) - 1) - 2^n è -1. Pertanto, l'intervallo dei numeri negativi è - (2^(n - 1)) a -1.

Metti tutto insieme e ottieni -2^(n - 1) in 2^(n - 1) - 1. Come puoi vedere, il limite superiore ottiene -1 che il limite inferiore non ha.

Ed è per questo che c'è un numero negativo in più rispetto al positivo.

0

Con 2s completano i numeri negativi sono definiti come il bit non è più 1 Questo riduce l'intervallo di possibili numeri in un dato numero di bit di 1 sul lato negativo.

0

Poiché l'intervallo include zero. Il numero di valori diversi che un numero intero di n bit può rappresentare è 2^n. Ciò significa che un numero intero a 16 bit può rappresentare 65536 valori diversi. Se è un numero intero a 16 bit senza segno, può rappresentare 0-65535 (incluso). La convenzione per interi con segno è quella di rappresentare -32768 a 32767, -214748368 a 214748367, ecc.

+0

Perché qualcuno vota questa risposta ? Potrebbe non essere la risposta più completa e dettagliata, ma è interamente * corretta *. –

0

In genere, a causa dell'utilizzo di un sistema a complemento a due per la memorizzazione di valori negativi, quando si capovolge il bit di segno su un numero intero viene polarizzato verso il negativo.

La gamma dovrebbe essere: -. (2^(n-1)) - ((2^(n-1) -1)

14

L'intervallo minimo richiesto da C è in realtà da -32767 a 32767, perché deve soddisfare il complemento a due, il complemento di tutti e la codifica di segno/magnitudine per i numeri negativi, il tutto consentito dallo standard C. Vedere Annex E, Implementation limits di C11 (e C99) per i dettagli sugli intervalli minimi per i tipi di dati.

La tua domanda riguarda solo la variante del complemento a due e il motivo è semplice. Con 16 bit, puoi rappresentare 2 (o 65.536) valori diversi e zero deve essere uno di quelli. Quindi ci sono un numero dispari di valori di sinistra, di cui la maggior parte (di uno) sono valori negativi:

1 thru 32767 = 37267 values 
0    =  1 value 
-1 thru -32768 = 32768 values 
        ----- 
        65536 values 

complemento Sia quelli e segno di magnitudo codifica consentono un valore negativo zero (sia positivi -zero), il che significa che uno schema in meno di bit è disponibile per i numeri diversi da zero, quindi l'intervallo minimo ridotto che si trova nello standard. complemento

1 thru 32767 = 37267 values 
0    =  1 value 
-0    =  1 value 
-1 thru -32767 = 32767 values 
        ----- 
        65536 values 

Two è in realtà uno schema di codifica abile perché i numeri positivi e negativi possono essere aggiunti insieme con lo stesso hardware semplice. Altri schemi di codifica tendono a richiedere hardware più elaborato per svolgere lo stesso compito.

Per una spiegazione completa su come funziona il complemento a due, vedere wikipedia page.