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