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