int
a type short
o byte
, i risultati sono inattesi? Scopriamolo!
int i = 450;
byte b = (byte)i;
System.out.println(b);
Risultato sullo schermo:
-62
Inaspettatamente, c'è una spiegazione logica per questo, inoltre, questa azione può essere eseguita con le tue mani. Per fare ciò, dobbiamo convertire 450 da decimale a binario:
450/2. 0
225/2. 1
112/2. 0
56/2. 0
28/2. 0
14/2. 0
7/2. 1
3/2. 1
1/2. 1
Nella colonna di destra del numero scriviamo il suo resto quando diviso per 2, e sotto il numero stesso scriviamo il risultato della divisione del nostro numero per due, se il resto è 0. Se il resto è 1, sotto scriviamo il parte intera della divisione per due. ( Calcolatrice online con spiegazione dei calcoli ). Di conseguenza, otteniamo che nel sistema di numeri binari 450 = 11100 0010
. Qualsiasi numero di tipo int
occupa 4 byte o 32 bit, dove ogni bit è 0 o 1. Nel nostro caso, sono occupati solo 9 bit e, in linea di principio, il nostro int i = 450
sistema binario è simile a questo:
0000_0000_0000_0000_0000_0001_1100_0010
Vogliamo scrivere la nostra variabile in una variabile di tipo byte
, ma il numero del tipo byte
occupa 1 byte (come segue dal nome di questo tipo) o 8 bit. Pertanto, i bit extra a sinistra vengono semplicemente scartati e alla fine otteniamo:
1100 0010
Intervallo di valori del tipo byte
: da -128 a 127. Ciascun numero occupa 8 bit e il bit più a sinistra di ciascun numero è il bit di segno. Per tutti i numeri positivi è uguale a 0, per tutti i numeri negativi è uguale a 1. Non è necessario affrettarsi a convertire il risultato ottenuto sopra nel 10° sistema, perché abbiamo ricevuto un codice aggiuntivo per il numero desiderato e non diretto. Il bit più a sinistra si è rivelato uguale a 1, quindi il nostro numero è negativo, e per i numeri negativi i codici diretto e inverso non coincidono, a differenza di quelli positivi. Se il bit di segno fosse uguale a 0, potremmo convertire immediatamente il numero nel sistema di numerazione decimale e ottenere: 66. Ma il bit di segno è negativo, quindi prima dobbiamo convertire il codice aggiuntivo in uno diretto e aggiungere un meno firmare alla risposta. Per chiarezza e formazione, proviamo prima a ottenere il codice aggiuntivo di un numero, ad esempio -15. Per fare ciò, nel codice diretto della sua rappresentazione positiva (numero 15), è necessario cambiare tutti gli 0 in 1 e viceversa (ottenere il codice inverso, chiamato anche inverso), quindi aggiungere uno al risultato. Nel sistema decimale 15 = 0000 1111
; Codice inverso (cambia tutti gli 0 in 1 e viceversa) = 1111 0000
; Codice aggiuntivo (aggiungi uno):
1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 1
1 1 1 1 0 0 0 1
Codice aggiuntivo per il numero -15: 1111 0001
; Ottimo, ora, per analogia con l'esempio sopra, dobbiamo convertire il nostro codice aggiuntivo in codice diretto; lascia che te lo ricordi, è uguale a 1100 0010
.
-
Sottrai uno e ottieni il codice inverso. È conveniente farlo, scrivere un codice aggiuntivo nella risposta e vedere cosa è necessario aggiungerne uno per ottenere tale codice aggiuntivo. Iniziamo con la cifra più a destra e guardiamo: a cosa dobbiamo aggiungere 1 per ottenere 0? A 1, otteniamo 10, 0 va in risposta e 1 va alla cifra successiva. Successivamente, cosa deve essere aggiunto a 0 per ottenerne uno. Uno, ma poiché abbiamo un uno dalla cifra precedente, in risposta scriviamo 0. Quindi, per ottenere 0, cosa dovremmo aggiungere a 0? Naturalmente, 0. Quindi altre 4 volte. E rimangono le ultime 2 cifre, dove devi aggiungere qualcosa a 0 per ottenere 1. Naturalmente, in entrambi i casi devi aggiungere 1. Totale:
1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
-
La parte più difficile è finita! Abbiamo ricevuto il codice inverso (inverso) e non dobbiamo fare altro che procurarci quello diretto. Invertiamo tutto da 0 a 1 e viceversa:
1100 0001
- codice inverso;0011 1110
- il codice diretto del nostro numero, ovvero la sua rappresentazione positiva; -
Conversione nel sistema decimale ( Calcolatrice online con spiegazione dei calcoli ):
0011 1110 = 0∙2^7+0∙2^6+1∙2^5+1∙2^4+1∙2^3+1∙2^2+1∙2^1+0∙2^0 = 0+0+32+16+8+4+2+0 = 62;
Non resta che aggiungere un meno al numero e alla nostra risposta:
-62.
short
in tipo int
:
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
-
10.000.000 nel 10° sistema numerico =
0000 0000 1001 1000 1001 0110 1000 0000
nel 2° sistema numerico.In Java, un numero di tipo
int
occupa 4 byte e unshort
numero di tipo richiede 2 byte o 16 bit, quindi tagliamo la sinistra a 16 cifre: -
Traduciamolo in codice inverso:
1 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0
Codice di ritorno:
1001 0110 0111 1111
; -
Invertiamo e otteniamo il codice diretto:
0110 1001 1000 0000
. -
Convertiamo nel sistema numerico binario e otteniamo una rappresentazione positiva del nostro numero:
1∙2^14+1∙2^13+1∙2^11+1∙2^8+1∙2^7 = 16384+8192+2048+256+128 = 27008.
-
Aggiungi un segno meno e ottieni la risposta:
-27008
1001 0110 1000 0000
. Il bit più a sinistra (il bit più significativo, noto anche come bit del segno) è risultato uguale a 1. Ciò significa che abbiamo un codice aggiuntivo per un numero negativo, quindi passiamo al punto successivo.
GO TO FULL VERSION