2010-01-04 13 views
28
 //key & hash are both byte[] 
     int leftPos = 0, rightPos = 31; 
     while(leftPos < 16) { 
      //possible loss of precision. required: byte, found: int 
      key[leftPos] = hash[leftPos]^hash[rightPos]; 
      leftPos++; 
      rightPos--; 
     } 

Perché un'operazione bit a bit su due byte in Java restituisce un int? So che potrei semplicemente restituirlo a byte, ma sembra sciocco.Perché l'operatore xor su due byte produce un int?

+0

per riferimento: http: //java.sun .com/docs/libri/JLS/third_edition/html/conversions.html # 5.6.2 e http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5233. Non conosco la logica, quindi non sto inviando una risposta. –

+0

Secondato. Non sono riuscito a trovare nulla che descrivesse * perché * si verifica quanto sopra, solo che lo fa. –

+1

La promozione del tipo esiste per diversi motivi. Per le operazioni bit a bit avrebbe molto meno senso che per quasi tutti gli altri, ma allora - perché no? Puoi sempre restituirlo. –

risposta

20

Perché la specifica della lingua lo dice. Esso fornisce alcuna ragione, ma ho il sospetto che questi sono i più probabili intenzioni:

  • di avere un piccolo e semplice insieme di regole per coprire le operazioni aritmetiche che coinvolgono tutte le possibili combinazioni di tipi di
  • Per consentire un'implementazione efficiente - Gli interi a 32 bit sono ciò che le CPU usano internamente e tutto il resto richiede conversioni, esplicite o implicite.
+3

L'utilizzo delle operazioni native della CPU a 32 bit è la ragione più probabile. – mletterle

2

Non vi sono operazioni bit a bit Java su due byte. Il codice converte implicitamente e in modo silenzioso quei byte in un tipo intero più grande (int) e il risultato è di quel tipo.

È ora possibile mettere in dubbio il buon senso di lasciare operazioni bit a bit su byte non definiti.

+0

Ancora una volta, la domanda era * perché * questo accade. –

+2

Ecco perché succede, la domanda che penso tu stia cercando è "Perché hanno deciso di lasciare gli operatori bit a bit sul tipo di byte indefinito, richiedendo il cast implicito su int?" – mletterle

+3

Le operazioni sono * non * non definite; in effetti sono definiti abbastanza chiaramente. È solo che il risultato è un int e non può essere memorizzato in un byte [] senza casting esplicito. –

4

Se è corretto e non ci sono nessun valore che può causare questa perdita di precisione , in altre parole: "la perdita impossibile di precisione", il compilatore dovrebbe stare zitto ... e devono essere corretti, e non getto dovrebbe essere aggiunto in questo:

byte a = (byte) 0xDE; 
byte b = (byte) 0xAD; 
byte r = (byte) (a^b);