Java implizite Typenumwandlung

  • Themenstarter Themenstarter a_java_user
  • Beginndatum Beginndatum
A

a_java_user

Gast
Hallo,

für meine Facharbeit in der Schule muss ich den AES-Algorithmus in JAVA implementieren. An sich ist das ganze nicht sonderlich schwer, auch wenn ich kein ausgesprochener Freund von JAVA bin.
Jetzt macht mir allerdings gerade beim Testen die Typenumwandlung von Integer -> Hexadezimal zu schaffen:

Java:
byte data[][] = new byte[2][1];

data[0][0] = (byte)0x19;
data[1][0] = (byte)0xA0;

aus mir unerfindlichen Gründen werden dem byte-Array negative Werte zugewiesen, was ja an sich eigentlich nicht passieren dürfte.

Ich habe dies dann nochmals mit folgendem Code getestet:
Java:
System.out.println(0x91);
System.out.println((byte)0x91);
System.out.println((byte)145); // 0x91 -> 145

eigentlich müsste ja nun auch bei der byte-Ausgabe 145 ausgegeben werden, doch leider ist hierbei der Wert -122 ausgegeben worden.


Daher würde mich nun interessieren, warum dies nicht funktioniert. Ich bin kein Programmieranfänger, benutze Java allerdings nur äußerst selten, da ich C++ und VB.Net favoritisiere.




Ich bedanke mich vielmals für eure Hilfe!


Grüße
 
Das hat primär nichts mit Java zu tun. Dein Problem ist folgendes:

In Java ist der Datentyp byte signed. Das bedeutet, in die acht bits die byte groß ist, steht im ersten Bit das Vorzeichen. Der Wertebereich liegt dadurch von -2^-7(-128) bis 2^7-1 (127).

127 ist binär:

0111 1111

128 ist binär

1111 1111

Da aber erstes Bit = 1, die Zahl ist negativ bedeutet kommt -128 raus. Dieses Problem hast du aber auch in C/C++ und nennt sich Bufferoverflow. Dort hast du meines Wissen nach aber die Möglichkeit zwischen signed und unsigned explizit zu unterscheiden.
 
Danke!

ja, in der Tat gibt es in C++ die Möglichkeit das so zu machen, daher habe ich da auch keine Probleme damit.
Aber erstmal danke für die Erklärung !


Grüße
 
Das hat primär nichts mit Java zu tun. Dein Problem ist folgendes:

In Java ist der Datentyp byte signed. Das bedeutet, in die acht bits die byte groß ist, steht im ersten Bit das Vorzeichen. Der Wertebereich liegt dadurch von -2^-7(-128) bis 2^7-1 (127).

127 ist binär:

0111 1111

128 ist binär

1111 1111

Da aber erstes Bit = 1, die Zahl ist negativ bedeutet kommt -128 raus. Dieses Problem hast du aber auch in C/C++ und nennt sich Bufferoverflow. Dort hast du meines Wissen nach aber die Möglichkeit zwischen signed und unsigned explizit zu unterscheiden.

11111111 ist -1 und nicht -128, denn es wird das Zweierkomplement verwendet. Das Bufferoverflow falsch ist wurde ja schon gesagt.
 
Nunja, nach 0111 1111 kommt 1000 0000. Darum wäre 128 nicht -1 sondern -0 😀 Aber das ist ja herumreiten auf Kleinigkeiten.
 

Neue Themen


Zurück
Oben