Question

La norme ISO C permet trois méthodes de codage pour les entiers signés:. Complément à deux, complément à un signe et / amplitude

Quelle est efficace ou bon moyen de détecter le codage lors de l'exécution (ou à un autre moment s'il y a une meilleure solution)? Je veux savoir ce que je puisse optimiser une bibliothèque bignum pour les différentes possibilités.

Je prévois le calcul de ce et de le stocker dans une variable chaque fois que le programme fonctionne donc il ne doit pas être aveuglante rapide - Je suppose que l'encodage ne changera pas au cours de l'exécution du programme: -)

Était-ce utile?

La solution

Il vous suffit de vérifier les bits de poids faible de la -1 constante avec quelque chose comme -1 & 3. Ce evalue à

  1. pour signe et grandeur,
  2. pour un complément à et
  3. pour le complément à deux.

Cela devrait même être possible de le faire dans une expression de préprocesseur à l'intérieur des constructions #if #else.

Autres conseils

Detecting complément à un devrait être assez simple - quelque chose comme if (-x == ~x). La détection du complément à deux devrait être à peu près aussi facile: if (-x == ~x + 1). Si ce n'est ni de ceux-ci, il doit être signe / grandeur.

Pourquoi ne pas le faire au moment de la compilation? Vous pourriez avoir les scripts de build / makefile compiler un programme de test en cas de besoin, mais d'utiliser le préprocesseur pour faire la compilation conditionnelle. Cela signifie également la performance est beaucoup moins important, car il fonctionne qu'une seule fois par la compilation, au lieu d'une fois par cycle.

Obtenir un pointeur vers un int qui montrerait un modèle binaire distinctif. Cast comme un pointeur vers unsigned int, puis examiner les valeurs de bits.

Faire cela avec quelques valeurs choisies avec soin devrait faire ce que vous voulez.

Je suppose que vous stocker un numéro de négatif en tant int dans un tableau de char assez grand pour contenir et comparer le tableau avec les différentes représentations pour savoir.

Mais ... UHM entiers non signés ne devraient pas avoir un signe, ont-ils?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top