2013-07-16 10 views
6

Ich mache ein kleines Java-Programm, das jede Art von Datei verschlüsselt. Die Art, wie ich es mache, ist das Folgende: Ich öffne die Eingabedatei, lese sie in einem Byte-Array mit derselben Größe wie diese Datei, führe dann die Codierung durch und schreibe das ganze Array in eine .dat-Datei namens output. dat. Um das Byte-Array zu indizieren, verwende ich eine Variable vom Typ int. Der Code:Java-Fehler: möglicher Verlust der Präzision

 for(int i : arr) { 
      if(i>0) { 
       arr[i] = arr[i-1]^arr[i]; 
      } 
     } 

'arr' ist ein Byte-Array mit der gleichen Größe wie die Eingabedatei.

Der Fehler erhalte ich: CodingEvent.java:42: Fehler: möglicher Verlust an Präzision

arr [i] = arr [i-1]^arr [i];

(ein Pfeil Fleck auf dem Operator ^)

erforderlich: byte

gefunden: int

Was ist los? Kannst du mir bitte helfen?

Antwort

7

Das Ergebnis von byte^byte ist, counter-intuitiv, int. Verwenden Sie eine Besetzung auf dem Ergebnis des Ausdrucks, wenn es wieder zu arr[i] Zuordnung:

arr[i] = (byte)(arr[i-1]^arr[i]); 

Dies ist, weil der Betreiber als dabei ein binary numeric promotion auf seinen Operanden definiert ist, und so, was es wirklich tut (in diesem Fall) ist :

arr[i] = (int)arr[i-1]^(int)arr[i]; 

... was natürlich in int resultiert. Deshalb brauchen wir den Cast zurück.

1

Die Operanden der Operatoren ^ sind zuerst converted to an int (es wird binäre numerische Heraufstufung genannt). Also beide byte s (arr[i-1] und arr[i]) werden in eine int umgewandelt und das Ergebnis der Operation ist ein int auch.

Sie müssen das Ergebnis zurück auf byte umwandeln, um es arr[i] zuzuweisen.

+1

LOL! Wir haben beide auf binäre numerische Konvertierung verwiesen. Das ist einfach zu geeky. –

0

Wenn arr [] von Byte-Typ ist [] dann das ist das Problem, wenn Java mit ganzen Zahlen jede binäre Operation der Fall ist, gibt es eine int oder lange abhängig von den Betreibern welken. In diesem Fall ist das Ergebnis arr [i-1]^arr [i] ein int, das Sie in einem Byte speichern möchten.

0

Blick auf die JLS 15.22.1

When both operands of an operator &, ^, or | are of a type that is convertible (§5.1.8) to a primitive integral type, binary numeric promotion is first performed on the operands (§5.6.2).

Und JLS 5.6.2

1.If any operand is of a reference type, it is subjected to unboxing conversion (§5.1.8).

2.Widening primitive conversion (§5.1.2) is applied to convert either or both operands as specified by the following rules:

  1. If either operand is of type double, the other is converted to double.

  2. Otherwise, if either operand is of type float, the other is converted to float.

  3. Otherwise, if either operand is of type long, the other is converted to long.

  4. Otherwise, both operands are converted to type int.

Daraus ergibt sich die unten Ausdruck wird erst in einem int.

arr[i-1]^arr[i]; 

Um es zu byte verwenden zurückgeworfen eine explizite Umwandlung:

arr[i] = (byte)(arr[i-1]^arr[i]); 
Verwandte Themen