Java Zahl in byte umrechnen?

4 Antworten

Auf der Konsole wird mir hier 33 ausgegeben.

Passt ja auch

Wie rechnet Java?

Prinzipiell mit Modulo 256 ... Da der Zahlenbereich 256 Zahlen umfässt.

Das passende Stichwort, unter dem du mehr Informationen zu bekommen kannst, ist Over-/Underflow. Bei einem Byte mit 8 Bit in der Zweierkomplementdarstellung ist 127 + 1 = -128 und -128 - 1 = 127

Woher ich das weiß:Studium / Ausbildung – Abgeschlossenes Studium der Informatik (B.Sc.)

Es nimmt die unteren 8 Bit von

0000 00I0 00I0 000I

Bei 673 =575+128 kommt -95 heraus

0000 00I0 I0I0 000I

Weil I0I0 000I als Binärzahl mit Vorzeichen dem Wert -(64+16+8+4+2 +1) = -95 entspricht.

RedDevil1982 
Fragesteller
 21.02.2023, 15:12

Also immer die unteren 8 Bit der Zahl

1

Man muss so oft 256 subtrahieren (oder addieren), bis man im Bereich -128 bis +127 liegt.

545 - 256 - 256 = 33

545%256 rechnet java.

Wenn du zu byte castest erhälst du wert modulo 256.

Edit: genaugenommen ((545 + 128)%256) - 128

RedDevil1982 
Fragesteller
 21.02.2023, 14:39

Stimmt nicht ganz. Wenn ich z. B.

byte j = (byte) 500 eingebe kommt -12 raus auf der Konsole

500 - 256 - 256 = -12

500 % 256 = 244

0
jort93  21.02.2023, 14:41
@RedDevil1982

Habe noch was ergänzt.

Die sache ist, java rechnet nicht 500 - 256 - 256

Java benutzt den modulo operator.

0
RedDevil1982 
Fragesteller
 21.02.2023, 14:42
@jort93

So ist es richtig! Darf man Fragen, wie du auf den Ansatz kommst?

0
xxxcyberxxx  21.02.2023, 14:43
@RedDevil1982
byte j = (byte) 500 eingebe kommt -12 raus auf der Konsole
500 - 256 - 256 = -12
500 % 256 = 244

Das ist beides das gleiche Ergebnis. Kongruenz ist nicht "die eine Zahl", sondern eine Gruppe an Zahlen, die die gleichen Rest bzgl einer Division geben.

Nur ist -12 im erlaubten Zahlenbereich (zwischen -128 uind 127) und 244 nicht

0
xxxcyberxxx  21.02.2023, 14:44
@RedDevil1982
Darf man Fragen, wie du auf den Ansatz kommst?
((545 + 128)%256) - 128

Es wird zuerst der Zahlenbereich von [-128; 127] auf [0; 255] verschoben, dann die Modulorechnung angewendet und dann wieder auf den ursprünglichen Zahlenbereich gebracht.

0
jort93  21.02.2023, 15:00
@RedDevil1982

Hier eine technische erklärung

https://docs.oracle.com/javase/specs/jls/se17/html/jls-5.html#jls-5.1.3

A narrowing conversion of a signed integer to an integral type T simply discards all but the n lowest order bits, where n is the number of bits used to represent type T. In addition to a possible loss of information about the magnitude of the numeric value, this may cause the sign of the resulting value to differ from the sign of the input value.
A narrowing conversion of a 
char
 to an integral type T likewise simply discards all but the n lowest order bits, where n is the number of bits used to represent type T. In addition to a possible loss of information about the magnitude of the numeric value, this may cause the resulting value to be a negative number, even though chars represent 16-bit unsigned integer values.

Sprich, du hast 000000...0001000100001(keine lust 32 zeichen zu zählen), das entspricht 545, da werden die zahlen links abgeschnitten bis nurnoch die letzten 8 bleiben.

00100001 = 33

Eine mathematische berechnung im engeren sinne ist das nicht.

0