Java Zahl in byte umrechnen?
byte j = (byte) 545;
Auf der Konsole wird mir hier 33 ausgegeben.
Wie rechnet Java?
Byte hat einen Bereich von -128 bis 127
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
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.
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
Habe noch was ergänzt.
Die sache ist, java rechnet nicht 500 - 256 - 256
Java benutzt den modulo operator.
So ist es richtig! Darf man Fragen, wie du auf den Ansatz kommst?
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
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.
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.
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