diff --git a/.gitignore b/.gitignore index 2e737e408a044a2d475f86e247ac778244348a2e..49d6dc29fd463fac2ef694d69dfbe665ca621088 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 ae3c1726048cd06b9a143e0376ed46dd9b9a8d53..0000000000000000000000000000000000000000 --- 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 71f736ff9f8e994ec235e235d5e752a16a3386ac..0000000000000000000000000000000000000000 --- 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 058dcdcadf2f559f61cb41b43914999bb6f76827..0000000000000000000000000000000000000000 --- 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 858650447fa87aafbd50840d5ecb3b3167ec4079..0000000000000000000000000000000000000000 --- 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 ae3c1726048cd06b9a143e0376ed46dd9b9a8d53..0000000000000000000000000000000000000000 --- 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 86eec252c8e2485796fe853d840cfb1545f6d346..0000000000000000000000000000000000000000 --- 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 17a2713267a723ffa3a82721494f9dca6ad7601d..0000000000000000000000000000000000000000 --- 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 d691827ba145edaacc1a12df884a2e45e1f5d9f1..074ff99ef475dae26696d620c7d5ad1548e6fbe6 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 505d28489272b1148edde17c9e39840ccc9802cd..8e1709ac298fa1336ebc98d8dbdbe0da210817a9 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 71f736ff9f8e994ec235e235d5e752a16a3386ac..bb35fa0a87b032ee9d0b128004c1edbd464f07bf 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 0000000000000000000000000000000000000000..5eee675c15f1088493f1c75aee8918476b2ea7f1 --- /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 0000000000000000000000000000000000000000..6bad6ba2742573947d03598030e8577cb75fde40 --- /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 + } +} + +