Wenn Sie wirklich gute Vergleiche von Ganzzahlen beliebiger Größe benötigen, empfehle ich Ihnen, sich The GNU Multiple Precision Arithmetic Library anzusehen. Dazu müssen Sie den speziellen mpz_t-Typ verwenden (der die Länge enthält). Dann können Sie die Funktion int mpz_cmp(mpz_t op1, mpz_t op2)
verwenden. Es ist nicht trivial, die eigene Darstellung großer Ganzzahlen zu entscheiden und sie so zu implementieren, dass sie sowohl tragbar als auch effizient ist.
Wenn Sie auf der anderen Seite nur die Standard-Integer-Größen benötigen, die Sie erwähnen, denke ich, dass Ihre Implementierung in Ordnung ist. Aber für eine noch bessere Portabilität sollten Sie keine Annahmen über die verschiedenen Integer-Größen machen:
#include <stdint.h>
int intcmp(const void *a, const void *b, size_t size) {
switch (size) {
case 1: return (*(int8_t*)a > *(int8_t*)b) - (*(int8_t*)a < *(int8_t*)b)
case 2: return (*(int16_t*)a > *(int16_t*)b) - (*(int16_t*)a < *(int16_t*)b)
case 4: return (*(int32_t*)a > *(int32_t*)b) - (*(int32_t*)a < *(int32_t*)b)
case 8: return (*(int64_t*)a > *(int64_t*)b) - (*(int64_t*)a < *(int64_t*)b)
}
assert(0);
return 0;
}
Vielleicht werden Sie es besser finden eine separate Funktion für jede Länge müssen Sie stattdessen zu erstellen, die für alle gleich mit? Und schließlich, wenn die Effizienz wichtig ist, ist es oft weniger effizient, Arithmetik mit char oder short als mit int. Versuchen Sie also, die Fälle zu vermeiden, in denen Sie diese Funktion mit char oder short aufrufen müssen, und verwenden Sie stattdessen int.
Es gibt immer GMP. – Antimony
Ich bezweifle, dass es dafür eine Standardfunktion gibt. Beachten Sie, dass Ihre Lösung nicht funktioniert, wenn Sie sowohl signierte als auch nicht signierte Typen benötigen. –
Sobald Sie von "Ganzzahlen einer beliebigen Größe" schreiben, denke ich, dass Sie jenseits des Bereichs von "Wenn die Architektur ein großer Endian ist" fallen, da diese Art von niedriger architektonischer Betrachtung keine Ganzzahlen von willkürliche Größe. Stattdessen müssen Sie entscheiden, wie Sie (sagen wir) 1024-Bit-Ganzzahlen darstellen und dann Ihre Funktion entsprechend schreiben möchten. – ruakh