From 977099d6acb06ba1252c2f65c2f0111dd6ea407d Mon Sep 17 00:00:00 2001 From: stedS <sven.steddin@reutlingen-university.de> Date: Thu, 5 Dec 2019 01:48:18 +0100 Subject: [PATCH] Beispiel Typecasting uebernommen --- .gitignore | 2 +- VL04-02/moduletest_lib/.gitignore | 1 - .../.settings/org.eclipse.jdt.core.prefs | 14 --- .../inf3vl/moduletest_lib/BlablaMachine.java | 20 ---- VL04-02/moduletest_main/.classpath | 11 -- VL04-02/moduletest_main/.gitignore | 1 - VL04-02/moduletest_main/.project | 17 --- .../inf3vl/moduletest_main/Mainclass.java | 8 -- .../Typecasting-C}/.classpath | 16 +-- .../Typecasting-C}/.project | 34 +++--- .../.settings/org.eclipse.jdt.core.prefs | 25 ++--- .../src/TypeCasting-Loesung.java | 105 ++++++++++++++++++ VL04_04/Typecasting-C/src/TypeCasting.java | 55 +++++++++ 13 files changed, 195 insertions(+), 114 deletions(-) delete mode 100644 VL04-02/moduletest_lib/.gitignore delete mode 100644 VL04-02/moduletest_lib/.settings/org.eclipse.jdt.core.prefs delete mode 100644 VL04-02/moduletest_lib/src/de/hsrt/inf/meti/inf3vl/moduletest_lib/BlablaMachine.java delete mode 100644 VL04-02/moduletest_main/.classpath delete mode 100644 VL04-02/moduletest_main/.gitignore delete mode 100644 VL04-02/moduletest_main/.project delete mode 100644 VL04-02/moduletest_main/src/de/hsrt/inf/meti/inf3vl/moduletest_main/Mainclass.java rename {VL04-02/moduletest_lib => VL04_04/Typecasting-C}/.classpath (61%) rename {VL04-02/moduletest_lib => VL04_04/Typecasting-C}/.project (88%) rename {VL04-02/moduletest_main => VL04_04/Typecasting-C}/.settings/org.eclipse.jdt.core.prefs (57%) create mode 100644 VL04_04/Typecasting-C/src/TypeCasting-Loesung.java create mode 100644 VL04_04/Typecasting-C/src/TypeCasting.java diff --git a/.gitignore b/.gitignore index 2e737e4..49d6dc2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -*.class +*.class !.gitignore \ No newline at end of file diff --git a/VL04-02/moduletest_lib/.gitignore b/VL04-02/moduletest_lib/.gitignore deleted file mode 100644 index ae3c172..0000000 --- a/VL04-02/moduletest_lib/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/VL04-02/moduletest_lib/.settings/org.eclipse.jdt.core.prefs b/VL04-02/moduletest_lib/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 71f736f..0000000 --- a/VL04-02/moduletest_lib/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,14 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=12 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=12 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=12 diff --git a/VL04-02/moduletest_lib/src/de/hsrt/inf/meti/inf3vl/moduletest_lib/BlablaMachine.java b/VL04-02/moduletest_lib/src/de/hsrt/inf/meti/inf3vl/moduletest_lib/BlablaMachine.java deleted file mode 100644 index 058dcdc..0000000 --- a/VL04-02/moduletest_lib/src/de/hsrt/inf/meti/inf3vl/moduletest_lib/BlablaMachine.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.hsrt.inf.meti.inf3vl.moduletest_lib; -import static java.lang.System.out; -public class BlablaMachine { - private static int blablaCounter = 0; - private BlablaMachine() { - //Konstruktor private --> factory Methode erforderlich - } - public static BlablaMachine blablaMachineFactory() { - if (blablaCounter == 0) { - blablaCounter++; - return new BlablaMachine(); - } - else { - return null; - } - } - public void makeBlabla(String nonsens) { - out.println("can't stop my " + nonsens + " blabla"); - } -} diff --git a/VL04-02/moduletest_main/.classpath b/VL04-02/moduletest_main/.classpath deleted file mode 100644 index 8586504..0000000 --- a/VL04-02/moduletest_main/.classpath +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<classpath> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk-13"> - <attributes> - <attribute name="module" value="true"/> - </attributes> - </classpathentry> - <classpathentry kind="src" path="src"/> - <classpathentry combineaccessrules="false" kind="src" path="/moduletest_lib"/> - <classpathentry kind="output" path="bin"/> -</classpath> diff --git a/VL04-02/moduletest_main/.gitignore b/VL04-02/moduletest_main/.gitignore deleted file mode 100644 index ae3c172..0000000 --- a/VL04-02/moduletest_main/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/VL04-02/moduletest_main/.project b/VL04-02/moduletest_main/.project deleted file mode 100644 index 86eec25..0000000 --- a/VL04-02/moduletest_main/.project +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<projectDescription> - <name>moduletest_main</name> - <comment></comment> - <projects> - </projects> - <buildSpec> - <buildCommand> - <name>org.eclipse.jdt.core.javabuilder</name> - <arguments> - </arguments> - </buildCommand> - </buildSpec> - <natures> - <nature>org.eclipse.jdt.core.javanature</nature> - </natures> -</projectDescription> diff --git a/VL04-02/moduletest_main/src/de/hsrt/inf/meti/inf3vl/moduletest_main/Mainclass.java b/VL04-02/moduletest_main/src/de/hsrt/inf/meti/inf3vl/moduletest_main/Mainclass.java deleted file mode 100644 index 17a2713..0000000 --- a/VL04-02/moduletest_main/src/de/hsrt/inf/meti/inf3vl/moduletest_main/Mainclass.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.hsrt.inf.meti.inf3vl.moduletest_main; -import de.hsrt.inf.meti.inf3vl.moduletest_lib.BlablaMachine; - -public class Mainclass { - public static void main(String[] args) { - BlablaMachine.blablaMachineFactory().makeBlabla("brrrchrr"); - } -} diff --git a/VL04-02/moduletest_lib/.classpath b/VL04_04/Typecasting-C/.classpath similarity index 61% rename from VL04-02/moduletest_lib/.classpath rename to VL04_04/Typecasting-C/.classpath index d691827..074ff99 100644 --- a/VL04-02/moduletest_lib/.classpath +++ b/VL04_04/Typecasting-C/.classpath @@ -1,10 +1,6 @@ -<?xml version="1.0" encoding="UTF-8"?> -<classpath> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk-13"> - <attributes> - <attribute name="module" value="true"/> - </attributes> - </classpathentry> - <classpathentry kind="src" path="src"/> - <classpathentry kind="output" path="bin"/> -</classpath> +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry excluding="*Loesung.java" kind="src" path="src"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/VL04-02/moduletest_lib/.project b/VL04_04/Typecasting-C/.project similarity index 88% rename from VL04-02/moduletest_lib/.project rename to VL04_04/Typecasting-C/.project index 505d284..8e1709a 100644 --- a/VL04-02/moduletest_lib/.project +++ b/VL04_04/Typecasting-C/.project @@ -1,17 +1,17 @@ -<?xml version="1.0" encoding="UTF-8"?> -<projectDescription> - <name>moduletest_lib</name> - <comment></comment> - <projects> - </projects> - <buildSpec> - <buildCommand> - <name>org.eclipse.jdt.core.javabuilder</name> - <arguments> - </arguments> - </buildCommand> - </buildSpec> - <natures> - <nature>org.eclipse.jdt.core.javanature</nature> - </natures> -</projectDescription> +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>Typecasting-C</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/VL04-02/moduletest_main/.settings/org.eclipse.jdt.core.prefs b/VL04_04/Typecasting-C/.settings/org.eclipse.jdt.core.prefs similarity index 57% rename from VL04-02/moduletest_main/.settings/org.eclipse.jdt.core.prefs rename to VL04_04/Typecasting-C/.settings/org.eclipse.jdt.core.prefs index 71f736f..bb35fa0 100644 --- a/VL04-02/moduletest_main/.settings/org.eclipse.jdt.core.prefs +++ b/VL04_04/Typecasting-C/.settings/org.eclipse.jdt.core.prefs @@ -1,14 +1,11 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=12 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=12 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=12 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/VL04_04/Typecasting-C/src/TypeCasting-Loesung.java b/VL04_04/Typecasting-C/src/TypeCasting-Loesung.java new file mode 100644 index 0000000..5eee675 --- /dev/null +++ b/VL04_04/Typecasting-C/src/TypeCasting-Loesung.java @@ -0,0 +1,105 @@ +/** 2014-11-03 (Steddin) +* Das Programm dient zur Demonstration der Eigenschaften von Integerzahlen, insbesondere +* der Vorzeichenarithmetik, sowohl bei Zahlenoperationen (dividieren, shift) als auch beim +* Typecasting. <p> +* +* Damit sich das Projekt übersetzten lässt, muss die kommentierte Version im Ordner \temp +* vom build-path ausgescholossen werden. +* +* @author Steddin +* @version 1.00, 2016-11-22 + * + */ +public class TypeCasting { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + int int32_A, int32_B, int32_Res; + short int16_A, int16_B, int16_Res; + float float_A, float_B; + double double_A, double_B; + char char_A, char_B; + byte byte_A, byte_B; + + int32_A = 0x7FFFFFFF; + int32_A = 2_147_483_647; //Zahlenliterale können bei Java mit Leerzeichen + //erweitert werden, um die Lesbarkeit zu erhöhen + + int32_Res = int32_A * 2; // = -2 : = 0xFFFF FFFE /auf Zahlenkreis demonstrieren! + int32_Res = int32_A * 4; // = -4 : = 0xFFFF FFFC /im LSB wird 0 nachgezogen + //--> keine Warnung vor Überlauf! Aus der positiven Zahl wird eine negative Zahl! + + int32_Res = (int32_A * 2) / 2; // = -1 : Durch Multipl. entsteht Überlauf (neg. Zahl) + // Bei Division bleibt Vorzeichen erhalten + int32_Res = (int32_A / 2) * 2; // = 2147483646 (0x7FFFFFFE) : + // nicht mal das haut hin! ... wegen Rundung bei Division + + //--> obwohl die Operationen scheinbar neutral: Ergebnis ist Überraschung (... nicht für den Binärexperte) + // Besondere Bedeutung: Klammerung bei Ausdrücken --> + // Praxistipp: viele Klammerebenen (sinnvoll!) verwenden bzw. nur wenige Operationen pro Zeile (auf diese + // Weise können die Zwischenergebnisse mit dem debugger überprüft werden. + // Assoziativgesetz so anwenden, dass möglichst keine Unterläufe oder Überläufe auftreten! + // Beispiel: + + int32_A = 1; + int32_B = 4; + //Auswertung von Links nach rechts: + int32_Res = int32_A * 12 + int32_B / 12 * 3; //schlecht: Unterlauf 4/12 --> 0: res somit = 12 statt 13 + int32_Res = int32_A * 12 + int32_B * 3 / 12; //besser: Reihenfolge der Operationen so gewählt, dass kein Unterlauf auftritt + //Ergebnis erwartungsgemäß = 12 + int32_Res = (int32_A * 12) + ((int32_B * 3) / 12); //übertrieben: jedoch direkt erkennbar, welche Zwischenergebnisse auftreten werden + + //Zerlegung in Zwischenschritte: + //- Vorteil: mit Debugger können Zwischenergebnisse geprüft werden + //- Nachteil: Rechenvorschrift nicht mehr direkt erkennbar + int32_Res = int32_B * 3; + int32_Res /= 12; + int int32_Res_Temp = int32_A * 12; + int32_Res += int32_Res_Temp; + + + + int32_A = 0x7FFFFFFF; + int32_B = 0xFFFFFFFF; // = - 1 + int16_Res = (short)int32_A; // = -1 --> Vorzeichen (+) wird nicht erhalten: + // Bei positiver Zahl wird nur das LSByte übernommen --> negativ! + // Soll das Vorzeichen erhalten bleiben --> vorher Shift Operation durchführen, + // dann wird allerdings das MSB übernommen und nicht das LSB! + // --> auch expliziter Typecast ist gefährlich! + int16_Res = (short)int32_B; // = -1 --> Vorzeichen Bit bleibt beim Abschneiden des MSByte erhalten + + + //Was passiert bei shift-Operationen mit dem Vorzeichenbit? + int32_Res = int32_A >> 16; // = 0x0000 7FFF = 2^15 --> es werden von links 0 nachgezogen: entspricht Division durch 2^16 + int32_Res = int32_B >> 16; // = 0xFFFF FFFF = -1 --> es werden von links 1 nachgezogen: entspricht ceil(-0.000...1) : Abrundung + int32_Res = int32_B / 0x00010000; // entspr. int32_B / 2^16 = 0; Division kommt im Gegensatz zum Shift zu betragsmäßig + // gerundetem Ergebnis: entspricht Aufrundung (hin zum größeren Wert). + + //Merke: Solange bei der SHR-Operation kein Unterlauf auftritt, funktioniert die "Ersatzdivision" auch bei + // negativen Zahlen, da vom MSB her 1er nachgezogen werden --> Zahl im Zweierkomplement korrekt + // Sobald der Unterlauf auftritt bleibt eine -1 stehen, da es eine -0 in Der Repräsentation des + // Zweierkomplements nicht gibt. + + //Division negativer Zahlen mit SHR funktioniert! + int32_A = 0xFFFF0000; // = -(2^16) = -65536 + int32_Res = int32_A >> 4; // = 0xFFFF F000 = -4096 + + + //Was wird nun eigentlich abgeschnitten: die MSBytes? + int32_A = 0x7F7F0001; + int32_B = 0x80000001; + + int16_Res = (short)int32_A; // = 1 --> es wird also das MSB abgeschnitten + int16_Res = (short)int32_B; // = 1 // Vorsicht bei den impliziten Typecasts : Vorzeichen bleibt u.U. nicht erhalten + + + int32_A = 0x00008001; + int16_Res = (short)int32_A; // = -32767 (0x8001) --> Zahl wird durch Abschneiden der MSB auf einmal negativ! + + int32_A = 0xFFFFFFFF; // == -1 + int32_Res = int32_A >>> 1; // == 0x7FFFFFFF = +2^15 (logical shift) + int32_Res = int32_A >> 1; // == 0xFFFFFFFF --> unerwarteterweise wieder -1 (arithmetic shift) + int32_Res = int32_A / 2; // == 0 + } +} diff --git a/VL04_04/Typecasting-C/src/TypeCasting.java b/VL04_04/Typecasting-C/src/TypeCasting.java new file mode 100644 index 0000000..6bad6ba --- /dev/null +++ b/VL04_04/Typecasting-C/src/TypeCasting.java @@ -0,0 +1,55 @@ +/** +* Typecasting.java +* +* Das Programm verdeutlicht Effekte, die bei der Durchführung des expliziten +* Typecasting auftreten. Die Ermittlung der Ergebnisse setzt die Kenntnis +* der Bildung von negativen Zahlen über das Zweierkomplement voraus. +* +* @author Steddin +* @version 1.00, 2016-11-22 +*/ +public class TypeCasting { + + public static void main(String[] args) { + + int int32_A, int32_B, int32_Res; + short int16_A, int16_B, int16_Res; + + int32_A = 0x7FFFFFFF; + int32_A = 2_147_483_647; + + int32_Res = int32_A * 2; + int32_Res = int32_A * 4; + + int32_Res = (int32_A * 2) / 2; + int32_Res = (int32_A / 2) * 2; + + int32_A = 0x7FFFFFFF; + int32_B = -1; + int16_Res = (short)int32_A; + int16_Res = (short)int32_B; + + int32_Res = int32_A >> 16; + int32_Res = int32_B >> 16; + int32_Res = int32_B / 0x10000; + + int32_A = 0xFFFF0000; + int32_Res = int32_A >> 4; + + int32_A = 0x7F7F0001; + int32_B = 0x80000001; + + int16_Res = (short)int32_A; + int16_Res = (short)int32_B; + + int32_A = 0x00008001; + int16_Res = (short)int32_A; + + int32_A = 0xFFFFFFFF; // == -1 + int32_Res = int32_A >>> 1; // (logical shift) + int32_Res = int32_A >> 1; // (arithmetic shift) + int32_Res = int32_A / 2; // Division + } +} + + -- GitLab