JavaRush /Java Blog /Random-IT /Casting di tipi primitivi. Casting int in short e byte
Георгий
Livello 22
Санкт-Петербург

Casting di tipi primitivi. Casting int in short e byte

Pubblicato nel gruppo Random-IT
Casting di tipi primitivi.  Casting int in short e byte - 1Perché se trasmetti alcuni valori di tipo inta type shorto 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 intoccupa 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 = 450sistema 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 byteoccupa 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.
  1. 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
  2. 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;

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

Allo stesso modo, i numeri di tipo vengono convertiti shortin tipo int:
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
  1. 10.000.000 nel 10° sistema numerico = 0000 0000 1001 1000 1001 0110 1000 0000nel 2° sistema numerico.

    In Java, un numero di tipo intoccupa 4 byte e un shortnumero di tipo richiede 2 byte o 16 bit, quindi tagliamo la sinistra a 16 cifre:

  2. 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.
  3. 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;

  4. Invertiamo e otteniamo il codice diretto: 0110 1001 1000 0000.

  5. 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.
  6. Aggiungi un segno meno e ottieni la risposta:-27008

Casting di tipi primitivi.  Casting int in short e byte - 2Collegamento a un calcolatore online di codici diretti, inversi e complementari. Anche su questo sito sotto la calcolatrice c'è una piccola teoria sul codice inverso e complementare.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION