[java]Datentyp Byte Fehler beim subtrahieren

09/12/2013 15:06 DasPrinzip.#1
Hallo,

Ich hab mal eine frage zu dem kleinen Java Schnipsel.

Code:
...
byte i = 1;

while(i<=5){
System.out.println(i);
i = i - 1;
}
...
Mir wird dort aber ein Fehler ausgeworfen in eingabeaufforderung.
Selbst wenn ich statt -1 eine Variable mit Byte deklariere und diese dann in die Schleife einfüge will es nicht klappen.

Den Fehler kann ich gerade nicht sagen, da ich unterwegs bin. Ich weiß nur das er diesen Fehler am Minus Zeichen angibt und meint das ich Byte nutze aber der Compiler ein integer findet.

Wenn ich i den Datentyp integer zuweise, klappt alles.

Warum klappt es aber nicht mit den Datentyp Byte?

Liebe Grüße
09/12/2013 15:28 South-Park#2
weil java intern mit int arbeitet und so aus deinem i - 1 intern ein int gemacht wird. und da int größer ist als byte, kommt der Fehler... Musst also auf Byte casten oder einfach i--; bzw --i; schreiben

Und nur als Anmerkung: Das da oben is ne Endlosschleife, i ist eins und du ziehst immer eins ab, wie solls da je größer wie 5 werden?
09/12/2013 15:35 DasPrinzip.#3
Casten habe ich auch versucht gibt mir trotzdem einen Fehler aus, egal ob (byte(1)) oder byte(1).
Das es eine endlosschleife ist, ist mir bewusst es geht mir um den Fehler der da vorhanden ist ;) rein aus Interesse

1-- hab ich auch versucht trotzdem gleicher Fehler
Wird dann mit --1 wahrscheinlich das gleiche sein.

Und außerdem hatte ich Ja versucht mit byte ab = 1; und dann in der Schleife die 1 mit ab ersetzt. Kein Erfolg.
09/12/2013 15:37 South-Park#4
DAS ist kein casten

Code:
 byte i = 1;
i = (byte) (i - 1);
DAS ist casten

aber trz, will man nur eins abzeihen bzw dazuzählen, benutzt man i++, ++i, i-- oder --i, je nach Anwendungsfall

Edit:
Code:
public class Cast {

    private static byte b = 1;

    public static void main(String[] args) {
        for (;;) {
            b++;
            b--;
            --b;
            ++b;
        }

    }
}
Das kompiliert bei mir ohne Probleme... 1-- macht auch keinen Sinn, du musst es an die Variable machen.... Solltest vllt ab und zu die Fehlermeldungen auch mal lesen :P
09/12/2013 16:17 DaKku0815#5
Hi,
also was den Fehler angeht, der ist wie schon oben erwähnt durch richtiges casten zu beheben.

Jedoch schreib ich trozdem nochmal was dazu um klarzustellen das durch die while-schleife keine Endlosschleife entsteht. Da byte nur ein Zahlenbereich von -128 bis 127 erfasst erfolgt, wenn man -128 dekrementiert, ein underflow und i wird zu 127. => i ist größer als 5 und die while schleife bricht ab.
09/12/2013 16:31 South-Park#6
Das wäre dann aber auch bei short, int , long irgendwann der Fall...
09/12/2013 18:25 DaKku0815#7
Genau, ich hab ja auch nicht behauptet das dies nur bei byte auftritt, dies war aber das Beispiel und da hat sich das eben angeboten.
BTW: Ne Möglichkeit den over- bzw. underflow zu umgehen wäre BigInteger, jedoch ist dies kein primitiver Datentyp und die standard arithmetischen Operationen funktionieren nicht.