019
15.10.2004, 13:13 Uhr
virtual
Sexiest Bit alive (Operator)
|
@Windalf
Vielleicht enttäusche ich Dich jetzt ein wenig:
Kleine Vorbemerkungen
Um erstmal dahin zukommen, daß man über die gleiche Anordnung von bits im Speicher redet, würde ich den BigEndian als darstellung wählen; zum einen, weil er der Network Byteorder entspricht und damit für BSD 4.3 kompatibeln Platformen und Windows entsprechende Konvertierungsroutinen (ntohs, ntohl, htons, htonl) bereitstehen, um 16 und 32 Bitwerte entsprechend zu handeln. Zum anderen, weil es für den Menschen am einfachsten interpretierbar ist.
Wenn man sich also schon auf die Darstellung geeinigt hat, dann benötigt man als nächstes genauer angaben über die Größe der Typen. Hier istr man mit C99 besser bedient als mit C++, weil es hier mit dem Header <stdint.h> einen Header gibt, der Typen entsprechend ihrer Bitanzahl definiert: uint8_t, ..., uint128_t usw. Denn Der Standard gibt nur ungefähr vor, wie groß die sachen zu sein haben:
C++: |
1 <= sizeof(char) <= siizeof(short) << sizeof(int) << sizeof(long)
|
Ein solcher Header fehlt in C++, deshalb müsste man hier entweder umständlich eigene Typdefinitionen machen, die von der Platform abhängen würde, oder aber auf C99 Features zurückgreifen, die eben nicht Bestandteil der ISO Norm für C++ sind.
Wie es genau in C99 ist, weiß ich aus dem Kopf jetzt nicht, aber zumindestens in C++ ist der mehr oder weniger exotische Fall denkbar, daß die kleinste adressierbare Einheit (das ist ein char) mehr als 8 Bit enthält. (der oben erwähnte, in C99 eingeführte Header stdint.h stellt mit uint_8 zwar in der Regel einen Typen für 8 Bit bereit, was darauf schliessen läßt, daß hier prinzipiell gilt, daß ein char 8 Bit hat, aber ich weiß nicht, ob das Vorhandensein des Typen int8_t zwingend ist oder nicht). In der Vergangenheit hat es solche Exoten jedenfalls gegegen: http://minnie.tuhs.org/pipermail/tuhs/2004-September/001070.html Darüberhinaus habe ich noch im Ohr, daß es mal eine Honeywell mit 9 Bit gab...
Fazit Letztlich muß man doch einige Einschränkungen in Kauf nehmen, so daß sich der Aufwand einer nur so begrenzt portablen Routine nicht lohnt. Ich würde Deine Routine halt dahingehend verbessern, daß sie noch in Networkbyteorder umwandelt und dem Benutzer ein Schönes Wochenende wünscht, wenn 8 != größe eines chars ist. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 15.10.2004 um 13:16 Uhr von virtual editiert. |