Datentypen Byte, Float und Boolean

max695

Mitglied
Wieso funktioniert das bei c so nicht? Ist ja der selbe Datentyp.
Java:
byte a = 3;
byte b = 2;
byte c = a + b;

Wieso kommt hier false als Ergebnis?
Java:
float x = 1000.0F;
float y = 0.00010F;
float a = x + y + y + y + y;
float b = y+ y + y + y + x;
boolean c = a == b;
 

VfL_Freak

Top Contributor
Moin,
Wieso funktioniert das bei c so nicht? Ist ja der selbe Datentyp.
Java:
byte a = 3;
byte b = 2;
byte c = a + b;
Du musst den Additionsausdruck casten, damit das Ergebnis wieder 'nur' ein byte ist !!
Java:
byte c = (byte)(a+b)

Wieso kommt hier false als Ergebnis?
Java:
float x = 1000.0F;
float y = 0.00010F;
float a = x + y + y + y + y;
float b = y+ y + y + y + x;
boolean c = a == b;
Schau' Dir mal per SysOut die einzelne Werte an !!
Java:
float x = 1000.0F;
float y = 0.00010F;
float a = x + y + y + y + y;
float b = y+ y + y + y + x;
boolean c = a == b;
System.out.println( a );
System.out.println( b );
System.out.println( c );

// Ergebnis:
1000.0005
1000.0004
false

https://www.holisticon.de/2013/08/korrekte-berechnungen-mit-praezision-in-java/

Gruß Klaus
 
Zuletzt bearbeitet von einem Moderator:

InfectedBytes

Top Contributor
Wieso funktioniert das bei c so nicht? Ist ja der selbe Datentyp.
Java:
byte a = 3;
byte b = 2;
byte c = a + b;
Berechnungen auf Datentypen die kleiner als int sind, werden dennoch als int durchgeführt. d.h. obwohl du byte+byte rechnest, ist das Ergebnis ein int. Liegt eben daran das der Prozessor eh nicht mit so kleinen Werten rechnet, sondern eben mit mindestens 32 Bit
 

CSHW89

Bekanntes Mitglied
Zu 1.: Alle arithmetischen Operatoren in Java arbeiten mit int oder long. a+b ist also ein int, welches du zu byte zurückkonvertieren musst: (byte) (a+b)
Zu 2.: Liegt an der Präzision von float/double. Überleg dir mal, wenn du im Dezimalsystem nur 4 Stellen zur Verfügung hast:
30000 + 14 + 14 + 14 = ...
30000 + 14 = 30014 (gerundet) 30010
30010 + 14 = 30024 (gerundet) 30020
30010 + 14 = 30034 (gerundet) 30030
Im Gegensatz zu:
14 + 14 + 14 + 30000 = ...
14 + 14 = 28
28 + 14 = 42
42 + 30000 = 30042 (gerundet) 30040

lg Kevin
 

Thallius

Top Contributor
Berechnungen auf Datentypen die kleiner als int sind, werden dennoch als int durchgeführt. d.h. obwohl du byte+byte rechnest, ist das Ergebnis ein int. Liegt eben daran das der Prozessor eh nicht mit so kleinen Werten rechnet, sondern eben mit mindestens 32 Bit

Nein, das liegt daran, dass Java keine echten Datentypen wie BYTE, SHORT etc anbietet und von daher immer nur Mist rauskommt wenn man was anderes als int order float rechnet. Mit C/C++ würde Dir das nicht passieren.

Gruß

Claus
 

CSHW89

Bekanntes Mitglied
Mist kommt da sicherlich nicht raus. Im Gegensatz zu C/C++ sind die Operationen mit Byte/Short ect... nämlich wohldefiniert. Wenn man die Ergebnisse falsch interpretiert, kann man natürlich denken, dass dabei Mist rauskommt. Eine einfache Addition von zwei Byte-Werten mit anschließender Rück-Konvertierung zu byte im Bereich -128 bis 127 funktioniert ohne Probleme. Außerhalb des Bereichs entsteht halt ein Überlauf, der so auch bei int, sowie bei jeder anderen Programmiersprache existiert. Das einzig "merkwürdige" bei Java ist, dass eben eine Addition von zwei Bytes nicht automatisch zu Byte konvertiert wird, nur weil es dort zu einem Überlauf kommen könnte. Etwas inkonsistent, da die Addition zweier Ints eben auch ein Überlauf erzeugen kann.
 

CSHW89

Bekanntes Mitglied
Das ist überhaupt kein Schwachsinn. Auf Prozessorebene wird (fast) immer mit ints gerechnet. Und der Vergleich mit float und int passt auch nicht. byte passt immer in int, int aber nicht in float. Es macht halt kein Unterschied, ob man direkt zwei bytes addiert und in ein byte speichert, oder den "Umweg" über ints macht. Der "Umweg" über ints ist aber performanter, bzw. bei vielen Prozessoren der einzige Weg. Das ist auch keine Eigenart von Java, sondern der Prozessoren.
 
Zuletzt bearbeitet:

CSHW89

Bekanntes Mitglied
Da gebe ich dir recht. Das hatte ich auch schon vorhin erwähnt. Arithmetische Operatoren mit ausschließlich Bytes sollte automatisch zu Byte konvertiert werden.
 

InfectedBytes

Top Contributor
Im Endeffekt wurde das gemacht, da der OPCode für einen Befehl exakt ein byte groß sein soll und wenn man nun für jeden Datentypen alle Operatoren separat definieren würde, hätte man eben nicht genug OPCodes
 

InfectedBytes

Top Contributor
Zitat aus den Java Specs: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.11.1
Given the Java Virtual Machine's one-byte opcode size, encoding types into opcodes places pressure on the design of its instruction set. If each typed instruction supported all of the Java Virtual Machine's run-time data types, there would be more instructions than could be represented in a byte. Instead, the instruction set of the Java Virtual Machine provides a reduced level of type support for certain operations. In other words, the instruction set is intentionally not orthogonal. Separate instructions can be used to convert between unsupported and supported data types as necessary.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S byte to float Java Basics - Anfänger-Themen 4
T Operatoren Float in byte umwandeln Java Basics - Anfänger-Themen 3
O 64bit- OS byte, short, int oder long bzw. float oder double? Java Basics - Anfänger-Themen 13
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
I Dateigröße von einem InputStream oder byte[] bekommen Java Basics - Anfänger-Themen 2
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
G ImageIcon in Byte-Array ablegen Java Basics - Anfänger-Themen 7
D Best Practice Parameter int vs byte Java Basics - Anfänger-Themen 16
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
S Byte-Array kann chars speichern? Java Basics - Anfänger-Themen 3
N Datentypen Image zu Byte-Array Java Basics - Anfänger-Themen 4
F byte, short oder doch int? Java Basics - Anfänger-Themen 6
S Performance von byte[], short[], int[]..? Java Basics - Anfänger-Themen 24
D Methoden int to byte array und zurück? Java Basics - Anfänger-Themen 5
P int zu byte Java Basics - Anfänger-Themen 8
F Byte Array wachsen lassen Java Basics - Anfänger-Themen 5
M Java Klasse Byte Java Basics - Anfänger-Themen 10
F Byte Ausgabe plötzlich falsch Java Basics - Anfänger-Themen 0
V String in Byte umwandeln Java Basics - Anfänger-Themen 11
O Input/Output Ein (negatives) Byte über PrintWriter hinausschreiben Java Basics - Anfänger-Themen 3
T byte[] zu String mit Sonderzeichen Java Basics - Anfänger-Themen 2
W Nullpointer bei Objekt Serialisierung mit ArrayList<byte[]> etc. Java Basics - Anfänger-Themen 2
J byte - Ausgabe Java Basics - Anfänger-Themen 2
F Teil eines Byte Array an eine Methode übergeben Java Basics - Anfänger-Themen 5
J Byte Folge erkennen Java Basics - Anfänger-Themen 5
M sehr großes Byte Array Java Basics - Anfänger-Themen 3
M Byte Array und Co. Java Basics - Anfänger-Themen 12
Y File to byte[] and byte[] to sysout Java Basics - Anfänger-Themen 3
P Wann Byte-Stream und wann Character-Stream? Java Basics - Anfänger-Themen 11
F Hexfolge in Byte Array ersetzen Java Basics - Anfänger-Themen 8
P String in byte konvertieren, wie? Java Basics - Anfänger-Themen 4
T Erste Schritte Byte Java Basics - Anfänger-Themen 3
R byte[] zu String und Ausgabe Java Basics - Anfänger-Themen 2
H Variablen short <-> byte[] Java Basics - Anfänger-Themen 15
X Datentypen String in byte[] Java Basics - Anfänger-Themen 29
H Variablen 32bit Zählwert als Byte-Array Java Basics - Anfänger-Themen 9
H Variablen string nach byte Java Basics - Anfänger-Themen 12
B Frage zur Effizienz von read und read(byte[]) Java Basics - Anfänger-Themen 23
R Erste Schritte Rechnenoperationen mit byte, short und char Java Basics - Anfänger-Themen 8
V Datentypen Frage zum Datentyp Byte Java Basics - Anfänger-Themen 11
L Byte[] to String, doch bits sind gespiegelt (MSB/LSB) Java Basics - Anfänger-Themen 3
S Von byte[] nach String zurueck nach byte[]. Arrays sind nicht identisch :( Java Basics - Anfänger-Themen 6
S ArrayList<Byte> in String umwandeln Java Basics - Anfänger-Themen 5
V unsigned byte? Java Basics - Anfänger-Themen 27
M byte Array Mindestlänge Java Basics - Anfänger-Themen 19
U short[] nach byte[] Java Basics - Anfänger-Themen 11
D [jni] jbytearray <-> byte array Java Basics - Anfänger-Themen 8
S Datentypen Ändern eines byte[] Arrays Java Basics - Anfänger-Themen 4
B byte-weise Verschlüsselung Java Basics - Anfänger-Themen 6
P byte Array aus ImageIcon Java Basics - Anfänger-Themen 10
S Input/Output String in byte umwandeln? Java Basics - Anfänger-Themen 5
F von Byte zu 2 Stellig Hex Java Basics - Anfänger-Themen 3
G byte[] (Base64) korrekt übergeben Java Basics - Anfänger-Themen 4
V Jar-Datei von Byte-Array oder Stream laden? Java Basics - Anfänger-Themen 9
G Binär in Byte speichern Java Basics - Anfänger-Themen 7
T Datentypen byte -Division..mal gehts mit cast mal ohne Java Basics - Anfänger-Themen 5
T Datentypen default ist int, cast zu byte nötig... Java Basics - Anfänger-Themen 2
F Byte nach Zahl umwandeln Java Basics - Anfänger-Themen 11
E Datentypen type cast problem (int, byte,) Java Basics - Anfänger-Themen 5
T Datentypen unsigned byte? Java Basics - Anfänger-Themen 9
G Integar zu Byte Java Basics - Anfänger-Themen 4
P Byte mit 0...255? Java Basics - Anfänger-Themen 5
N Datentypen Fehler beim Umwandeln in byte Java Basics - Anfänger-Themen 3
L Umwandlung int <--> byte Java Basics - Anfänger-Themen 2
L Datentypen 250 und byte? Java Basics - Anfänger-Themen 4
L Datentypen byte[] in String und wieder zurück Java Basics - Anfänger-Themen 3
H Datentypen Byte-Array RSA Java Basics - Anfänger-Themen 9
H Datentypen Rechnen mit signed Byte-Array - unsinged byte Java Basics - Anfänger-Themen 3
N Files mit Byte an Socket versenden Java Basics - Anfänger-Themen 2
V Byte -> String -> Byte verlustfrei Java Basics - Anfänger-Themen 12
Hindi93 Byte to Int Java Basics - Anfänger-Themen 4
H Datentypen byte[] to int Java Basics - Anfänger-Themen 9
S hex zu byte Java Basics - Anfänger-Themen 4
M Byte Array: Werte größer 127? Java Basics - Anfänger-Themen 11
S Addition zweier 32 Byte langer ByteArrays Java Basics - Anfänger-Themen 5
H 1 Byte Status Variable Java Basics - Anfänger-Themen 3
P Datentypen Byte und char Typecast Java Basics - Anfänger-Themen 2
M Bit/Byte Operationen Java Java Basics - Anfänger-Themen 8
W Datentypen int -> byte Java Basics - Anfänger-Themen 2
H Datentypen Byte-Array aus Stream lesen Java Basics - Anfänger-Themen 3
F Typenumwandlung byte <=> int verstehen Java Basics - Anfänger-Themen 3
S Byte eines arrays Java Basics - Anfänger-Themen 17
N Frage zu Datentyp byte Java Basics - Anfänger-Themen 14
B unsigned byte Problem Java Basics - Anfänger-Themen 9
S 2 Byte Arrays addieren Java Basics - Anfänger-Themen 45
S Unbekannte Daten einlesen, speichern und in einem byte Array speichern Java Basics - Anfänger-Themen 3
S Alle Datentypen in byte Array und zurückwandeln Java Basics - Anfänger-Themen 2
H Frage zu Byte-Streams Java Basics - Anfänger-Themen 2
Z Wie Byte[] in einen String oder int konvertieren Java Basics - Anfänger-Themen 2
0 byte[] -> hex Java Basics - Anfänger-Themen 2
G char[] in byte[] konvertieren? Java Basics - Anfänger-Themen 2
V Byte Arrays in Strings umwandeln und splitten Java Basics - Anfänger-Themen 2
M unsigned byte Java Basics - Anfänger-Themen 4
F Byte 0 und 1 einzelnd zuweisen? Java Basics - Anfänger-Themen 17
G byte [] aus uRL erhalten Java Basics - Anfänger-Themen 11
J Byte-Array als Hex-Datei speichern? Java Basics - Anfänger-Themen 9
G Hex to Byte Java Basics - Anfänger-Themen 13
S Byte in Zahl umwandeln Java Basics - Anfänger-Themen 3
M Double-Wert in Byte[] umwandeln Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben