Comment détecter encodages sur des entiers signés en C?
-
26-09-2019 - |
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: -)
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 à
- pour signe et grandeur,
- pour un complément à et
- 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?