Datentypen und ihre Größe

stulleman

Bekanntes Mitglied
Guten Tag zusammen,

ich versuche zur Zeit einen kleinen Emulator für den CHIP-8 Prozessor zu schreiben, weil ich gelesen habe das der besonders einfach sei. Jedoch stoße ich am Anfang schon auf ein paar Probleme. Es geht darum das ich nicht weiß welche Datentypen ich am besten verwende.
Ich habe dazu sogar ein Tutorial gefunden, aber da ich es nicht einfach abschreiben will, habe ich ein paar Tests gemacht und verstehe einige Sachen nicht.
In der Beschreibung von Wikipedia steht das die opcodes 2 bytes (16 bits) lang sind. Wieso benutzt er dann ein char[] memory Array, und nicht ein short[] memory Array?

Desweiteren verstehe ich nicht wieso
Code:
opcode = 0xA2 << 8 | 0xA2;
bei mir nicht funktioniert. Er will das ich es zu short caste, da dort ein Int rauskommt. Aber wenn ich richtig gerechnet habe müsste doch dort ein 16 bit opcode rauskommen, also in einem short speicherbar sein oder nicht?
 
N

nillehammer

Gast
Wieso benutzt er dann ein char[] memory Array, und nicht ein short[] memory Array?
Die "echten" Zahltypen sind in Java alle Vorzeichenbehaftet, (während die Opcodes vorzeichenlos sind?). Deswegen kann in einem short wahrscheinlich nicht der komplette benötigte Zahlenraum abgebildet werden. Ein char ist in Java vorzeichenlos. Deswegen hat der Kollege das wohl verwendet. Finde ich aber nicht so gut, weil char eigentlich ein Zeichentyp ist, in dem der Unicode-Wert des Zeichens gespeichert ist. Das kann man natürlich als Zahlwert interpretieren/missbrauchen. Aber bei allen Ausgaben kommt da nur Grütze raus, weil Java es eben als Zeichen ausgeben will.
Desweiteren verstehe ich nicht wieso opcode = 0xA2 << 8 | 0xA2; bei mir nicht funktioniert. Er will das ich es zu short caste, da dort ein Int rauskommt. Aber wenn ich richtig gerechnet habe müsste doch dort ein 16 bit opcode rauskommen, also in einem short speicherbar sein oder nicht?
Der Shift-Operator ist so definiert, dass er einen int liefert. Auch wenn das Ergebnis in einen short passen würde, weil der Wert klein genug ist, wandelt Java das trotzdem nicht selbst um. Denn das kann ja nicht für alle Fälle garantiert werden. Deswegen musst du explizit casten. Damit sagst Du Java: "Ich weiß, dass der Wert klein genug ist. Deswegen ist ein Cast sicher und führt nicht zu korrupten Daten."
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
Tatsache! Habe gerade ein bischen rumgespielt und der Compiler berechnet die Werte vor (bei Literalen kann er das ja) und ist wohl so nett, es zu akzeptieren, wenn das Ergebnis klein genug ist. Das klappt auch mit anderen Operatoren (z.B. *).

Wenn man allerdings eins der Literale durch einen Methodenaufruf ersetzt, geht es wieder nicht. Auf jeden Fall eine sehr interessante Feinheit, die Du da ansprichst.
 

stulleman

Bekanntes Mitglied
Also siehst du es genau so, dass es eigentlich mit 8 auch klappen müsste? Wenn ich mir die Zahl Binär ausgeben lasse zähle ich mit 7 auch nur 15 bits.
 
N

nillehammer

Gast
Also siehst du es genau so, dass es eigentlich mit 8 auch klappen müsste? Wenn ich mir die Zahl Binär ausgeben lasse zähle ich mit 7 auch nur 15 bits.
Code:
A2 << 8
ist ja im Grunde nichts anderes als
Code:
162 * (2 ^8)
also
Code:
162 * 256 = 41472
das ist höher als Short.MAXVALUE (32767). Passt also nicht mehr in den Wertebereich. Insofern stimme ich Dir DA nicht zu.
 

stulleman

Bekanntes Mitglied
Aber das finde ich komisch! << 8 Füllt doch einfach 8 Nullen auf oder nicht? Und hängt man an 8 bit 8 bit ran sind wir immer noch bei 16 bits. Oder habe ich irgendwas falsch verstanden?
 
N

nillehammer

Gast
Aber das finde ich komisch! << 8 Füllt doch einfach 8 Nullen auf oder nicht?
Finde die Formulierung "auffüllen" etwas unglücklich. Würde wirklich eher von "Reinschieben" sprechen, aber ja und schiebt alles davor nach links.
Und hängt man an 8 bit 8 bit ran sind wir immer noch bei 16 bits
Du baust hier aber nicht einfach zwei 8bit-Arrays zu einem längeren 16bit-Array zusammen. Wegen der Vorzeichenbehaftung des Datentyps kann ein Shifting zu einem Überlauf führen, weil effektiv nur 15bit für den Betrag der Zahl zur Verfügung stehen. Wenn das Shiften also dazu führt, dass eine 1 an die am meisten linke (und eben noch nicht darüber hinaus) Position geschoben wird, ist das schon ein überlauf, obwohl 8bit + 8bit 16bit ergeben.
 
Zuletzt bearbeitet von einem Moderator:

stulleman

Bekanntes Mitglied
Okay danke! Aber könntest du mir jetzt noch helfen und sagen wie ich das ganze löse? Einfach einen größeren Datentyp benutzen? Weil die opcodes sind in jedem Fall nur 2 Byte groß.
 
S

Spacerat

Gast
Ist ja ein netter Vorsatz nicht abschreiben zu wollen, aber in diesem Fall ein Irrtum. Char bietet sich hier nun mal als naheliegendster Datentyp an, verwende ihn einfach.
 

stulleman

Bekanntes Mitglied
Ich hatte bloß eben Probleme mit char. Soll ich dann alles in char speichern? Also Memory, Stack, Registers? Ich habe es jetzt mal mit int versucht (siehe diese Seite) und es klappt ganz gut, bis auf diesen opcode: 3XNN Skips the next instruction if VX equals NN. Ich habe ihn so implementiert:

Java:
case 0x3000:
			if(V[(opcode & 0x0F00)] == (opcode & 0x00FF))
				pc += 4;
			System.out.println("Opcode: Skips the next instruction if VX equals NN.");
		break;

Java:
opcode = memory[pc] << 8 | memory[pc + 1];
		
		switch(opcode & 0xF000) {
		
		case 0x0000:
			switch(opcode & 0x000F)  {
			
			case 0x0000:
				// TODO:
				pc += 2;
				System.out.println("Opcode: Clears the screen.");
			break;
				
			case 0x000E:
				// TODO:
				pc += 2;
				System.out.println("Opcode: Returns from a subroutine.");
			break;
			
			default:
				System.out.println("Error: Unknow opcode: " + "0x" + Integer.toHexString(opcode));
			}
		break;
		
		case 0x1000:
			pc = opcode & 0x0FFF;
			System.out.println("Opcode: Jumps to address NNN.");
		break;
		
		case 0x2000:
			// TODO:
			pc += 2;
			System.out.println("Opcode: Calls subroutine at NNN.");
		break;
		
		case 0x3000:
			if(V[(opcode & 0x0F00)] == (opcode & 0x00FF))
				pc += 4;
			System.out.println("Opcode: Skips the next instruction if VX equals NN.");
		break;
		
		case 0xA000:
			I = opcode & 0x0FFF;
			pc += 2;
			System.out.println("Opcode: Sets I to the address NNN.");
		break;
			
		default:
			System.out.println("Error: Unknow opcode: " + "0x" + Integer.toHexString(opcode));
		}
 

piu58

Mitglied
> Soll ich dann alles in char speichern?
Für systemnahe Programme ist Java nun mal nicht erste Wahl. Da muss man mit Kompromissen leben. Das hier größte Problem besteht darin, das die Sprache die prozessortypischen Datentypen nicht kennen *kann*, weil plattformunabhäbgig.
 

stulleman

Bekanntes Mitglied
Ja, ich denke das Problem ist das in Java alle Datentypen außer char signed sind.
Ich werde es mal versuchen alles in char zu speichern.
Wenn mir jetzt vielleicht noch jemand mit dem opcode helfen könnte wäre das echt super! Bin mir nämlich nicht sicher ob es nicht wegen den Datentypen oder wegen der Implementierung klappt.

MfG

Max
 
S

Spacerat

Gast
pc bedeutet wohl Programmcounter. Geskipped werden 2 + 2 (also eine Instruktion). was aber wenn die Bedingung nicht zutrifft? Geht's dann erneut bei Skip weiter? Schalte die mal in einem else-Fall weiter (+2), damit die nächste Instruction ausgeführt wird.
 

stulleman

Bekanntes Mitglied
Das ist was, was ich nicht bedacht habe, aber in diesem Fall nicht der Fehler sein kann, da ich in jedem Fall nur einen cycle ablaufen lasse. (Zu Testzwecken) Das Problem ist das ich eine Array Out Of Bounds Exception kriege.
Code:
V[(opcode & 0x0F00)]
V ist ein char-Array in dem die Register gespeichert sind. Wenn ich mir jetzt
Code:
opcode & 0x0F00
als binary ausgeben lasse kommt das raus : 10100000000. Das heißt die ersten 3 Stellen stimmen, ich habe nämlich die Zahl 5 als Ziel Register übergeben. Entweder brauche ich eine Methode um die letzten 8 bits loszuwerden, oder es gibt dafür eine andere Vorgehensweise?
 
S

Spacerat

Gast
Wie gross ist denn das Array? Evtl. nur so gross, wie es Opcodes gibt? Dann solltest du diese Opcodes vor dem Lesen aus dem Array isolieren und rechtsbündig shiften (z.B. >>> 8 bei 255 Opcodes).
 

stulleman

Bekanntes Mitglied
Das Array ist 16 groß. In der CHIP-8 Beschreibung steht das es genau 16 Register gibt und 16 ist dabei die carry flag. Das heißt V1 - VF.
Vielleicht ist es gar nicht klar was ich machen will?
Ich habe den opcode z.B. 0x3123. Wenn es mit 3 anfängt muss ich gucken ob Register
Code:
0x1 == 0x23
ist.
Das heißt ich versuche die Zahl 1 auszulesen und das versuche ich mit
Code:
opcode & 0x0F00
. Kann das stimmen?

[EDIT]Ich glaube ich habe den Fehler jetzt gefunden, ich weiß nicht ob du das eben meintest aber so
Code:
V[(opcode & 0x0F00 >>> 8)]
klappt es jetzt![/EDIT]
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Genau, das meinte ich. Evtl. schreibst jetzt noch [c]V[(opcode >>> 8) & 0xF][/c], dann hast du biem verknüpfen nicht mehr so 'ne grosse Zahl. Ausserdem, vorsicht! Deine Klammern passen nicht...[c]V[(opcode & 0x0F00) >>> 8][/c]
 
Zuletzt bearbeitet von einem Moderator:

stulleman

Bekanntes Mitglied
Ja ich habe jetzt auch gemerkt das was noch nicht stimmen kann!
Dazu habe ich folgenden Test gemacht:
Java:
       char a = 0x3F;
		char b = 0xFF;
		
		char opcode = (char) (a << 8 | b);
		
		System.out.println("Binary: " + Integer.toBinaryString(opcode));
		System.out.println("Decimal: " + Integer.toString(opcode));
		
		opcode = (char) ((opcode & 0xF000) >>> 8);
		
		System.out.println("Binary: " + Integer.toBinaryString(opcode));
		System.out.println("Decimal: " + Integer.toString(opcode));

Ausgabe:
Code:
Binary: 11111111111111
Decimal: 16383
Binary: 110000
Decimal: 48

Das heißt doch das er die Nullen von der 3 weglässt und so ein Fehler entsteht oder?
 

stulleman

Bekanntes Mitglied
Okay sorry, ich habe wieder zu voreilig gepostet!
Ich hatte natürlich noch einen Fehler im code!
Um bei einem hex wert z.B. die 2. Stelle herauszufinden muss man
Code:
(opcode & 0x0F00) >>> 8
machen. Um die erste zu finden
Code:
(opcode & 0xF000) >>> 12
. Die 3.
Code:
(opcode & 0x00F0) >>> 4
usw. !
Danke für die Hilfe bis hier hin!
 
S

Spacerat

Gast
Um bei einem hex wert z.B. die 2. Stelle herauszufinden muss man
Code:
(opcode & 0x0F00) >>> 8
machen. Um die erste zu finden
Code:
(opcode & 0xF000) >>> 12
. Die 3.
Code:
(opcode & 0x00F0) >>> 4
usw. !
Danke für die Hilfe bis hier hin!
Gut erkannt. ;)
Aber ernsthaft, ist
Code:
(opcode >>> 12) & 0xF für das höchste
(opcode >>>  8) & 0xF für das 2. höchste
(opcode >>>  4) & 0xF für das 2. niedrigste und
(opcode       ) & 0xF für das niedrigste
nicht bequemer? Sollte sich die Reihenfolge der "Nibbles" mal ändern, braucht man sich um die &-Werte schon mal keine Gedanken mehr machen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Datentypen Das Verhalten von Strings als Datentypen Java Basics - Anfänger-Themen 7
T Unterschiedliche Datentypen - worin abspeichern? Java Basics - Anfänger-Themen 18
N Verschiedene Konstruktoren mit gleichen Datentypen Java Basics - Anfänger-Themen 8
J Einige Anfängerfragen (Datentypen, Wertebereich) Java Basics - Anfänger-Themen 11
thor_norsk Datentypen unter Java Java Basics - Anfänger-Themen 3
T Datentypen Eigene Datentypen Java Basics - Anfänger-Themen 15
T for-each-Schleife, verschiedene Datentypen Java Basics - Anfänger-Themen 1
G Methoden Methoden mit versch. Datentypen Java Basics - Anfänger-Themen 1
Nicolex3 Größere Datentypen Java Basics - Anfänger-Themen 35
FelixN Array mit verschiedene Datentypen als Rückgabewert? (Long und Double) Java Basics - Anfänger-Themen 3
mihe7 Von Datentypen und (mehrdimensionalen) Arrays Java Basics - Anfänger-Themen 4
P Datentypen, Klassen, Operatoren, Wrapperklassen Java Basics - Anfänger-Themen 2
W Vergleiche bei generischen Datentypen Java Basics - Anfänger-Themen 7
D Eingabe einscannen, ohne vorher einen Datentypen anzugeben? Java Basics - Anfänger-Themen 1
M Datentypen Generische Datentypen - Syntax Java Basics - Anfänger-Themen 25
L Binären Bäume für beliebige Datentypen Java Basics - Anfänger-Themen 15
L Datentypen Ausgabe von eigenem Datentypen Java Basics - Anfänger-Themen 2
T Datentypen Kann Java 2 verschiedene Datentypen vergleichen? Java Basics - Anfänger-Themen 2
A Datentypen Unterschiedliche Datentypen in einer Eingabe einlesen Java Basics - Anfänger-Themen 2
Queiser Datentypen 2 generische Datentypen für eine Schnittstelle Java Basics - Anfänger-Themen 1
SHasteCode Datentypen Überlauf primitiver Datentypen Java Basics - Anfänger-Themen 4
S Datentypen Java Basics - Anfänger-Themen 14
Antegra Tekkrebell Primitive Datentypen Literal 8072 Java Basics - Anfänger-Themen 21
N Array gleiche Datentypen zusammenrechnen Java Basics - Anfänger-Themen 28
S Datentypen Java Basics - Anfänger-Themen 4
S generische methode mit verschiedenen datentypen Java Basics - Anfänger-Themen 3
H wählen des kleinstmöglichen Datentypen für Gleitkommazahlen. Java Basics - Anfänger-Themen 2
S Datentypen Java Basics - Anfänger-Themen 2
S Datentypen Abstrakte Datentypen Java Basics - Anfänger-Themen 0
J Zusammenhang Numbers und nummerische Datentypen Java Basics - Anfänger-Themen 2
F Variablen unterschiedlicher Datentypen Java Basics - Anfänger-Themen 6
A Abstrakte Datentypen - Methode delete Java Basics - Anfänger-Themen 6
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
D Spezifikation abstrakter Datentypen Java Basics - Anfänger-Themen 3
W Datentypen Datentypen vergleichen Java Basics - Anfänger-Themen 4
B JAVA Datentypen/Überlauf Java Basics - Anfänger-Themen 4
I Erste Schritte HILFE bei Datentypen Java Basics - Anfänger-Themen 2
J Wertebereiche und Datentypen Java Basics - Anfänger-Themen 12
N Methode mit 2 Datentypen. Fehler? Java Basics - Anfänger-Themen 1
N Probleme mit Datentypen Java Basics - Anfänger-Themen 6
S Datentypen Unterschied elementare und zusammengesetzte/strukturierte Datentypen Java Basics - Anfänger-Themen 5
L Beliebigen Datentypen aus String parsen Java Basics - Anfänger-Themen 6
M Wann eine Wrapper Klasse verwenden und wann einen primitiven Datentypen? Java Basics - Anfänger-Themen 8
K new / Datentypen Java Basics - Anfänger-Themen 3
T Variablen Varargs und beliebige Datentypen Java Basics - Anfänger-Themen 7
S Datentypen Sonderbehandlung primitiver Datentypen, fixe Konstanteninterpretation Java Basics - Anfänger-Themen 10
G Wertebereiche bei Datentypen Java Basics - Anfänger-Themen 10
G Erste Schritte Über verschiedene Datentypen iterieren. Gibt es sowas? Java Basics - Anfänger-Themen 19
SheldoN Gibt es größere Datentypen als long? Java Basics - Anfänger-Themen 2
S Abfrage Objekt-Array nach Datentypen Java Basics - Anfänger-Themen 6
B Variablen Wie macht man eine call by reference mit primitiven Datentypen in Java? Java Basics - Anfänger-Themen 2
H Mehrer Datentypen aus einer Methode ausgeben. Java Basics - Anfänger-Themen 25
O Array mit unterschiedlichen Datentypen ausgeben... Java Basics - Anfänger-Themen 16
A Generische Datentypen Java Basics - Anfänger-Themen 8
R Input/Output verschiedene Datentypen als Bytes in Datei speichern Java Basics - Anfänger-Themen 15
T ArrayList mit verschiedenen Datentypen verhindern Java Basics - Anfänger-Themen 8
N Bedingung für Datentypen Java Basics - Anfänger-Themen 3
R Array aus verschiedenen Datentypen Java Basics - Anfänger-Themen 29
J Datentypen Datentypen Java Basics - Anfänger-Themen 7
S Datentypen Array fill Methode - unterschiedliche Datentypen Java Basics - Anfänger-Themen 6
H null und primitive Datentypen Java Basics - Anfänger-Themen 6
N ArrayList mit eigenem Datentypen Java Basics - Anfänger-Themen 3
B Wie kann ich unterschiedliche Datentypen in einem Feld abbilden? Java Basics - Anfänger-Themen 5
S Datentypen Die verschiedene Java Datentypen [Anfänger] Java Basics - Anfänger-Themen 8
M Frage zu Datentypen Java Basics - Anfänger-Themen 4
B Welcher Feld Typ für verschiedene Datentypen? Java Basics - Anfänger-Themen 4
O Rückgabewert mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 10
S Nicht Primitive Datentypen Java Basics - Anfänger-Themen 5
C Verwendung von primitiven Datentypen Java Basics - Anfänger-Themen 8
Spin Eigenen Abstrakten Datentypen Java Basics - Anfänger-Themen 28
J Datentypen Rechnen mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 3
B Wieviele bits belegen die Datentypen? Java Basics - Anfänger-Themen 2
S Alle Datentypen in byte Array und zurückwandeln Java Basics - Anfänger-Themen 2
C Explizite und implizite Datentypen Java Basics - Anfänger-Themen 12
F primitive Datentypen, String, Klassen Java Basics - Anfänger-Themen 16
Povlsen84 HashSet mit eigenen Datentypen Java Basics - Anfänger-Themen 6
J Verschieden Datentypen in ein "Array" Java Basics - Anfänger-Themen 13
M HashMap mit primitiven Datentypen Java Basics - Anfänger-Themen 10
SebSnake Operatoren für eigene Datentypen Java Basics - Anfänger-Themen 3
G Frage zum Ungang mit Generische Datentypen Java Basics - Anfänger-Themen 4
G Überladen von Konstruktoren mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 4
R datentypen konvertierung u modulorechnung Java Basics - Anfänger-Themen 15
G primitive Datentypen als Referenz an eine Methode übergeben Java Basics - Anfänger-Themen 2
G Wertebereiche und Datentypen Java Basics - Anfänger-Themen 3
W Datentypen in JAva Java Basics - Anfänger-Themen 2
G verschiedene datentypen in arraylist Java Basics - Anfänger-Themen 14
N Problem mit Tastatureingaben für verschiedene Datentypen Java Basics - Anfänger-Themen 3
I Array für verschiedene Datentypen? Java Basics - Anfänger-Themen 5
E Eigenen datentypen erstellen Java Basics - Anfänger-Themen 14
Y Neuen Datentypen erstellen Java Basics - Anfänger-Themen 12
M int toString Datentypen Umwandeln, AnfängerProblem Java Basics - Anfänger-Themen 3
M Datentypen zu erzeugen? Java Basics - Anfänger-Themen 2
S Switch für komplexe Datentypen? Java Basics - Anfänger-Themen 7
7 Datentypen Java Basics - Anfänger-Themen 8
S Array mit mehreren Datentypen Java Basics - Anfänger-Themen 5
D String in einen primitiven datentypen parsen Java Basics - Anfänger-Themen 3
F Einlesen von verschieden Datentypen Java Basics - Anfänger-Themen 15
G Verschiedene Datentypen in Vector packen und zurück Java Basics - Anfänger-Themen 3
G Datentypen Java Basics - Anfänger-Themen 2
D Datentypen umwandeln Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben