Esercizio 1complemento a 2, esadecimale e IEEE 754
In questa pagina 11
Testo (questionario di dicembre 2022 del corso di Fondamenti di Informatica UniPD, in Java; adattato da un tema d'esame in Java: domande a risposta multipla, qui con risposta motivata e verificata in Python). Teoria: Rappresentazione binaria dei datiBasi 2, 8 e 16; interi senza segno e in complemento a 2 con overflow; virgola mobile IEEE 754 e sue approssimazioni; caratteri ASCII, Unicode e UTF-8.Rappresentazione binaria dei dati →.
- Quanti simboli diversi si possono ottenere con un codice a 4 bit?
- Il numero binario
1111111in complemento a 2 a 7 bit: quanto vale in base 10? - Rappresentare in complemento a 2 a 8 bit.
- Il numero è rappresentabile in complemento a 2 a 8 bit?
- Il numero
000 1011 0010è un intero in complemento a 2 a 11 bit. Qual è la sua rappresentazione a 20 bit? - Scrivere in esadecimale e convertire
A1F0in base 10. - Qual è il numero successivo a rappresentabile in IEEE 754 a singola precisione?
- Qual è il massimo
int(32 bit) e che cosa succede sommando 1? - In Java, che cosa fa l'enunciato
int x = (int) Long.MAX_VALUE;: dà un errore, e quanto valex?
1. Simboli di un codice a 4 bit
Ogni bit ha 2 valori e i bit sono indipendenti: simboli.
2. 1111111 a 7 bit
Il bit più significativo vale , gli altri pesano :
Regola rapida: tutti 1 è sempre , in qualunque larghezza.
3. a 8 bit
Con bit il campo è , quindi è rappresentabile. Per ottenerlo: ; si invertono i bit () e si somma 1:
Verifica: .
4. a 8 bit
Il massimo positivo a 8 bit è : non è rappresentabile. La stringa 1000 0000 esiste ma vale , non (il campo è asimmetrico: un negativo in più).
5. Estensione del segno
Per passare a più bit si replica il bit di segno a sinistra. Qui il bit di segno è :
(Con un numero negativo si aggiungerebbero degli : 111 1111 a 7 bit diventa 1111 1111 1111 1111 a 16 bit, ancora .)
6. Esadecimale
- , cioè cifre e :
F1. A1F0: 41456.
7. Numero successivo a in singola precisione
. In singola precisione la parte frazionaria ha 23 bit: il passo tra due numeri vicini con esponente è . Il successivo è . Non è : tra e ci sono circa numeri rappresentabili.
8. Massimo int e overflow
Con 32 bit il massimo è . Sommando 1 in aritmetica a 32 bit si ottiene , che in complemento a 2 ha il bit di segno a 1: il risultato è . In Java e in C questo overflow non produce errori; in Python gli interi non hanno limite e il risultato resta corretto.
9. Da long a int
Il cast (int) di un long tronca ai 32 bit meno significativi, senza errori né in compilazione né in esecuzione. Long.MAX_VALUE ha tutti i bit a tranne il segno; i 32 bit bassi sono tutti e, letti in complemento a 2 a 32 bit, valgono : x = -1. In C (int)LLONG_MAX dà lo stesso valore sulle macchine usuali (il risultato è definito dall'implementazione); in Python la conversione non esiste, gli interi non hanno limite.
Verifica in Python
import struct
def cmp2(n, bit):
"""rappresentazione di n in complemento a 2 su 'bit' bit (stringa)"""
assert -(1 << (bit - 1)) <= n < (1 << (bit - 1)), "non rappresentabile"
return format(n & ((1 << bit) - 1), f"0{bit}b")
def valore(s):
"""valore di una stringa di bit in complemento a 2"""
return int(s, 2) - (1 << len(s)) if s[0] == "1" else int(s, 2)
def estendi(s, bit):
return s[0] * (bit - len(s)) + s
print(2 ** 4) # 16
print(valore("1111111")) # -1
print(cmp2(-79, 8)) # 10110001
print(-128 <= 128 <= 127) # False: 128 non sta in 8 bit
print(estendi("00010110010", 20)) # 00000000000010110010
print(format(241, "X"), int("A1F0", 16)) # F1 41456
x = struct.unpack(">I", struct.pack(">f", 2.0))[0] # bit di 2.0 come intero
succ = struct.unpack(">f", struct.pack(">I", x + 1))[0] # il successivo
print(succ, succ - 2.0 == 2 ** -22) # 2.000000238418579 True
def somma32(a, b): # somma "alla C" su 32 bit
s = (a + b) & 0xFFFFFFFF
return s - (1 << 32) if s >> 31 else s
print(somma32(2 ** 31 - 1, 1)) # -2147483648
print(somma32(2 ** 63 - 1, 0)) # -1: i 32 bit bassi di Long.MAX_VALUE letti come intErrori comuni
- Scrivere come "segno e modulo" (
1100 1111): in complemento a 2 si inverte e si somma 1. - Credere che e siano entrambi rappresentabili a 8 bit.
- Estendere un numero negativo con zeri invece che con il bit di segno.
- Pensare che dopo venga : i float sono a passo variabile e non rappresentano esattamente .
Versione ripasso
Questionario di dicembre 2022 (Fondamenti di Informatica, UniPD, in Java). Teoria: Rappresentazione binaria dei datiBasi 2, 8 e 16; interi senza segno e in complemento a 2 con overflow; virgola mobile IEEE 754 e sue approssimazioni; caratteri ASCII, Unicode e UTF-8.Rappresentazione binaria dei dati →.
- 4 bit → simboli.
1111111a 7 bit: (tutti 1 vale sempre ).- a 8 bit: , inverti
1011 0000, →1011 0001(campo ). - a 8 bit: non rappresentabile (
1000 0000). - Estensione del segno:
000 1011 0010→0000 0000 0000 1011 0010(si replica il bit di segno). -
F1;A1F0. - Dopo in singola precisione: (23 bit di frazione, esponente 1), non .
- Massimo
int; dà (overflow silenzioso in Java e C, non in Python). (int) Long.MAX_VALUE: tronca ai 32 bit bassi,-1, nessun errore.
Errori comuni: segno e modulo al posto del complemento a 2; a 8 bit; estendere un negativo con zeri.