2010-03-16 23 views
14

So che Java non consente i tipi non firmati, quindi mi chiedevo in che modo lancia un intero su un byte. Supponiamo di avere un numero intero a con un valore di 255 e di trasmettere il numero intero a un byte. Il valore è rappresentato nel byte 11111111? In altre parole, il valore è trattato più come un intero con segno a 8 bit, oppure copia solo gli ultimi 8 bit del numero intero?Come vengono convertiti i numeri interi in byte in Java?

risposta

18

Questo è chiamato narrowing primitive conversion. Secondo la specifica:

Una conversione restringimento di un intero con segno a un tipo intero T scarta semplicemente tutto ma le n bassi bit di ordine, dove n è il numero di bit utilizzati per rappresentare tipo T. Oltre a una possibile perdita di informazioni sull'entità del valore numerico, ciò potrebbe far sì che il segno del valore risultante differisca dal segno del valore di input.

Quindi è la seconda opzione elencata (copiando direttamente gli ultimi 8 bit).

Non sono sicuro dalla tua domanda se sei o meno consapevole di come sono rappresentati i valori interi firmati, quindi per sicurezza ti faccio notare che il valore di byte 1111 1111 è uguale a -1 nel sistema two's complement (quale Java utilizza).

+0

Sì, sapevo del complemento a due. Quindi, per chiarire, se ho un tipo lungo con un valore di -1 e lo scrivo su un int, il risultato sarà 65535? Grazie per la risposta rapida e dettagliata a proposito. – LandonSchropp

+1

@helixed: No, sarà anche -1 perché è anche tutti quelli. Qualsiasi cosa nell'intervallo del tipo più piccolo verrà convertita nel valore equivalente. –

+0

Oh aspetta, vedo. A causa del complemento a 2, qualsiasi valore negativo all'interno dell'intervallo del tipo più piccolo verrà riempito comunque di 1 (in binario), quindi il risultato manterrà sempre il suo segno. Grazie ancora. – LandonSchropp

1

Solo un pensiero su ciò che viene detto: maschera sempre il tuo intero quando converti in byte con 0xFF (per ints). (Supponendo che a myInt siano stati assegnati valori da 0 a 255).

ad es.

char myByte = (char)(myInt & 0xFF); 

perché? se myInt è più grande di 255, solo typecasting su byte restituisce un valore negativo (complemento a 2) che non si desidera.

+0

char è due byte grandi in java. – Paul

+3

'char' è 16 bit in java. Se cambi il tuo esempio in 'byte', non funziona neanche e potrebbe comunque produrre un valore negativo. È possibile mascherare con 0x7F, ma i valori negativi non vengono convertiti correttamente. Il buon modo per assicurarti di non incappare in problemi è probabilmente di "asserire -128 <= myInt && myInt <= 127;' –

+0

@Philippe, grazie. Sto lavorando molto tardi, quindi l'ho scritto troppo velocemente, ma quanto è "short" in java? –

2

o lo fa solo copiare direttamente gli ultimi 8 bit del numero intero

sì, questo è il modo in cui questo casting funziona

+0

Grazie. Questo è davvero il punto chiave. – Hong

4
int i = 255; 

byte b = (byte)i; 

Quindi il valore di essere in esadecimale è 0xFF ma il valore decimale sarà -1.

int i = 0xff00; 

byte b = (byte)i; 

Il valore di b ora è 0x00. Questo mostra che java prende l'ultimo byte del numero intero. vale a dire. gli ultimi 8 bit, ma questo è firmato.

0
for (int i=0; i <= 255; i++) { 
    byte b = (byte) i; // cast int values 0 to 255 to corresponding byte values 
    int neg = b;  // neg will take on values 0..127, -128, -127, ..., -1 
    int pos = (int) (b & 0xFF); // pos will take on values 0..255 
} 

La conversione di un byte che contiene un valore maggiore di 127 (cioè ,. valori 0x80 attraverso 0xFF) ad un int risultati in segno estensione del bit di ordine alto del valore byte (cioè bit 0x80). Per rimuovere il bit "extra", utilizzare x & 0xFF; questo forza i bit superiori a 0x80 (cioè i bit 0x100, 0x200, 0x400, ...) a zero ma lascia gli 8 bit più bassi così come sono.

È inoltre possibile scrivere questi; sono tutti equivalenti: int pos = ((int) b) & 0xFF; // converti prima b in int, poi striscia i bit alti int pos = b & 0xFF; // fatto come aritmetica int - il cast non è necessario

Java "promuove" automaticamente i tipi interi la cui dimensione (in # di bit) è minore di int a un valore int quando si esegue l'aritmetica. Questo viene fatto per fornire un risultato più deterministico (rispetto a C, che è meno vincolato nelle sue specifiche).

Si consiglia di dare un'occhiata a this question on casting a 'short'.

0

Questa è la mia versione di lanciare qualsiasi oggetto possibile Byte

private Byte castToByte(Object value, Byte def) 
{ 
    if (value instanceof Integer) 
    { 
     return ((Integer) value).byteValue(); 
    } 
    else if (value instanceof Number) 
    { 
     return ((Number) value).byteValue(); 
    } 
    else if (value instanceof String) 
    { 
     return Byte.valueOf((String) value); 
    } 
    return def; 
} 
0

Secondo la mia comprensione, si intende

Integer i = new intero (2);
byte b = i; // non funzionerà

final int i = 2;
byte b = i; // fine

Finalmente
byte b = nuovo byte (2);
int a = b; // fine

0

byte è 8 bit. 8 bit può rappresentare 256 numeri. (2 raise a 8 = 256)
Ora il primo bit è utilizzato per il segno. [se positivo quindi primo bit = 0, se negativo primo bit = 1]
diciamo che si desidera convertire un numero intero da 1099 a byte. basta dividere 1099 per 256. resto è la vostra rappresentazione byte int
esempi
1099/256 => = rimanente 75
-1099/256 => = -75 resto
2049/256 => resto = 1
motivo per cui? guarda questa immagine http://i.stack.imgur.com/FYwqr.png

Problemi correlati