2016-04-29 6 views
-1

Je travaille sur un émulateur Chip-8 en C dans le but de le rendre aussi multi-plateforme et aussi petit que possible pour la compatibilité avec les systèmes embarqués et les systèmes avec des spécifications faibles (et me mettre au défi), ce qui signifie pouvoir utiliser SDL, ncurses (quand j'arrive à ce point) et quelque chose d'autre aussi. En tant que tel, j'ai utilisé des caractères non signés à la place d'ints ou d'ints non signés, et j'ai utilisé "typedef unsigned char byte" pour le rendre plus pratique. Est-ce que je perds mon temps, même dans le but de le rendre compatible avec de très petits systèmes, ou est-ce que l'utilisation de "typedef unsigned int byte" suffirait sans sacrifier la performance?Utilité du char non signé sur les systèmes embarqués en C

+0

Je ne sais pas à propos de Chip-8, mais googling je l'ai lu est de 8 bits. Supposons que le type int ait aussi la taille d'un octet et le caractère char, il est indifférent d'utiliser 'typedef unsigned int' ou' typedef unsigned char'. Ils ont le même effet. – ViniciusArruda

+0

Oui, Chip-8 est un langage de 8 bits, mais mon souci était moins avec l'interpréteur/émulateur lui-même et plus avec le système hôte. Alors, la taille de int va changer avec le système pour lequel il a été compilé? – eggbertx

+0

essayez d'imprimer sizeof (int). il peut très bien être 1 octet pour ce compilateur pour cette cible, c'est une sorte d'idée du type de variable int, elle varie en fonction de la cible (plus que char ou long). –

Répondre

1

Vous devez simplement séparer l'interpréteur des liaisons io.

Seul l'interpréteur doit être portable 8 bits.

Chaque plate-forme cible disposera d'un ensemble différent de technologies disponibles pour les E/S. SDL ou curses vous donnera une sorte de portabilité entre les plates-formes * nix et windows mais si possible, vous aurez probablement 32 bits entiers, peut-être avoir à faire avec 16 bits. Mais sûrement pas avec des entiers de 8 bits. D'autre part, en traitant des processeurs de métal nu de 8 bits et 16 bits, vous n'aurez probablement qu'à connecter votre projet directement au pilote graphique.

+0

Il utilise principalement 8 bits pour traiter spécifiquement l'ensemble d'instructions lui-même. Alors devrais-je seulement utiliser ou traiter des entiers de 8 bits avec le jeu d'instructions/cpu struct et les entiers non signés ordinaires pour tout le reste? – eggbertx

+0

Oui, sauf si vous avez une cible spécifique de 8 bits. Tout ce qui est vivant est d'au moins 32 bits, à l'exception de certains contrôleurs pic et avr 16bit qui coûtent le même prix que leurs évolutions en 32 bits. – xvan

+0

Idéalement, je veux qu'il soit compatible avec tous les systèmes humainement possibles. Encore une fois, pour le défi, c'est pourquoi j'ai commencé avec des entiers 8 bits, et pourquoi j'ai inclus la possibilité de ncurses comme une alternative à SDL – eggbertx

0

Vous avez l'idée de base, mais pas la solution. En C moderne, nous avons le type dans stdint.h.

C'est le type que vous devez utiliser, ce qui signifie que vous dites au compilateur: "Je n'ai pas besoin de plus de 8 octets pour cet entier, mais n'hésitez pas à utiliser une taille plus grande si cela améliore les performances."

+0

Mais cela ne causerait-il pas des problèmes de comparabilité en construisant quelque chose comme DOS? – eggbertx

+0

@Josh Pourquoi construiriez-vous pour DOS? Non, cela ne causera aucun problème de compatibilité, c'est la beauté des types stdint.Bien que vous ne connaissiez pas la taille de l'entier, vous devez le traiter comme 'uint8_t' lorsque vous envisagez des promotions de type implicite. – Lundin