2016-04-29 8 views
-1

Ich arbeite an einem Chip-8-Emulator in C mit dem Ziel, es so plattformübergreifend und so klein wie möglich für die Kompatibilität mit eingebetteten Systemen und Systemen mit niedrigen Spezifikationen zu sein (und um mich selbst herauszufordern), was bedeutet, SDL, ncurses (wenn ich an diesen Punkt komme) und etwas anderes zu verwenden. Als solche habe ich unsigned Zeichen anstelle von Ints oder unsigned Ints verwendet, und ich habe "typedef unsigned char Byte" verwendet, um es bequemer zu machen. Vergeude ich meine Zeit, selbst mit dem Ziel, sie idealerweise mit sehr kleinen Systemen kompatibel zu machen, oder wäre es einfach, "typedef unsigned int byte" zu verwenden, ohne Leistung zu opfern?Nützlichkeit von unsigned char in eingebetteten Systemen in C

+0

Ich weiß nicht über Chip-8, aber googeln ich lese das ist 8 Bit. Angenommen, der int-Typ hat die Größe eines Bytes und auch char, ist es gleichgültig, 'typedef unsigned int' oder' typedef unsigned char' zu verwenden. Sie haben den gleichen Effekt. – ViniciusArruda

+0

Ja, Chip-8 ist eine 8-Bit-Sprache, aber meine Sorge war weniger mit dem Interpreter/Emulator selbst und mehr mit dem Host-System. Also ändert sich die Größe von int mit dem System, für das es kompiliert wurde? – eggbertx

+0

versuchen, sizeof (int) auszudrucken. es kann sehr gut 1 Byte für diesen Compiler für dieses Ziel sein, das ist eine Art der Idee des int-Variablentyps, es variiert abhängig vom Ziel (mehr als char oder long). –

Antwort

1

Sie sollten den Interpreter nur von den io-Bindungen trennen.

Nur der Interpreter muss 8 Bit tragbar sein.

Für jede Zielplattform wird ein anderer Satz von Technologien für IO verfügbar sein.

SDL oder Curses geben Ihnen eine Art Portabilität zwischen * nix und Windows-Plattformen, aber wenn verfügbar, werden Sie wahrscheinlich 32-Bit-Ganzzahlen haben, müssen vielleicht mit 16 Bits beschäftigen. Aber sicher nicht mit 8 Bit Ganzzahlen.

Auf der anderen Seite bedeutet der Umgang mit 8-Bit- und 16-Bit-Bare-Metal-Prozessoren, dass Sie Ihr Projekt wahrscheinlich direkt an den Grafiktreiber anschließen.

+0

Es verwendet 8-Bits hauptsächlich für den Umgang mit dem Befehlssatz selbst. Also sollte ich dann nur 8-Bit-Ganzzahlen mit dem Befehl set/cpu struct und regulären unsigned-ints für alles andere verwenden oder behandeln? – eggbertx

+0

Ja, es sei denn, Sie haben ein spezifisches 8-Bit-Ziel. Alles am Leben ist mindestens 32 Bit, außer einigen populären Pic und Avr 16bit-Controllern, die die gleichen Kosten wie ihre 32-Bit-Entwicklungen kosten. – xvan

+0

Idealerweise möchte ich, dass es mit jedem System kompatibel ist, das für Menschen möglich ist. Wiederum für die Herausforderung, weshalb ich anfänglich mit 8-Bit-Ganzzahlen begonnen habe, und warum ich die Möglichkeit von Ncurses als Alternative zu SDL eingefügt habe – eggbertx

0

Sie haben die Grundidee richtig, aber nicht die Lösung. Im modernen C haben wir die Art in stdint.h.

Dies ist der Typ, den Sie verwenden sollten, was bedeutet, dass Sie dem Compiler sagen: "Ich brauche nicht mehr als 8 Bytes für diese Ganzzahl, aber fühlen Sie sich frei, eine größere Größe zu verwenden, wenn das die Leistung verbessert."

+0

Aber würde das keine Vergleichbarkeitsprobleme verursachen, wenn Sie etwas wie DOS erstellen? – eggbertx

+0

@Josh Warum würdest du für DOS bauen? Nein, es wird überhaupt keine Kompatibilitätsprobleme verursachen, das ist die Schönheit der Standardtypen.Obwohl Sie nicht wissen, wie groß die ganze Zahl ist, müssen Sie sie wie "uint8_t" behandeln, wenn Sie implizite Typ-Promotions betrachten. – Lundin