genaue Große von Datentyp definieren



  • Hallo,

    gibt es eine Möglichkeit eigenen Datentypen eine genaue Größe (in Bit) zuzuweisen?
    Also der Standard macht ja (afaik) in der Regel nur Aussagen zu Mindestgrößen.

    Ich dachte dabei an einen Datentyp, der exakt 8 bits ist.
    char ist ja mindestens 8bit groß, oder? Aber nicht genau...

    Gruß,
    Newbie



  • Wie du korrekt angemerkt hast kann dir das der Standard nicht garantieren. Allerdings kann es eine spezifische Implementierung.

    Üblicherweise definierst du einfach mit einem typedef den gewünschten Typen mit der aktuellen Grösse in einem seperaten File und vermerkst halt irgendwo, dass beim portieren dort der Typ ev. angepasst werden muss auf den zu der aktuellen Implementierung passenden Typen.



  • Hab dir in dem anderen Thread schon geantwortet:

    aber lt. standard ist char genau 8bit groß:

    ISO/IEC 14882:2003(E) --- 5.3.3 Sizeof schrieb:

    1. The sizeof operator yields the number of bytes in the object representation of its operand. The operand is either an expression, which is not evaluated, or a parenthesized type-id. The sizeof operator shall not be applied to an expression that has function or incomplete type, or to an enumeration type before all its enumerators have been declared, or to the parenthesized name of such types, or to an lvalue that designates a bit-field. sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1; the result of sizeof applied to any other fundamental type (3.9.1) is implementation-defined. [Note: in particular, sizeof(bool) and sizeof(wchar_t) are implementation-defined.69) ] [Note: See 1.7 for the definition of byte and 3.9 for the definition of object representation. ]

    bb



  • Der Standard garantiert sizeof(char) == 1 . Die meisten verbreiteten Architekturen arbeiten mit 8 Bit pro Byte, also sollte das hinkommen.


  • Mod

    Wie schon gesagt, ist char mindestens 8 Bit groß.

    Es gibt eine Klasse std::vector<bool>, bei der wird vom Standard garantiert, dass sie (im Rahmen der Möglichkeiten der unterliegenden Architektur) bitweise vorliegende Daten möglichst platzsparend speichert. Das ist dann auch 100% portabel.





  • unskilled schrieb:

    lt. standard ist char genau 8bit groß:

    Das stimmt nicht. Per Definition belegt ein char ein Byte. Aber es ist nicht festgelegt, dass ein Byte aus 8 Bits besteht. Ein Byte ist einfach das kleinste, was sich im Speicher adressieren lässt. Das müssen keine Oktette sein. Dafür gibt es in <climits> ja auch das Makro CHAR_BIT, welches zu einer Ganzzahlkonstante expandiert, die mindestens 8 ist.



  • Im Prinzip kann es einem doch egal sein, ob ein Typ genau x Bits groß ist, solange der Standard garantiert, dass es nicht weniger als x Bits sind?



  • ähnliches Thema im anderen Thread (bzgl. bit-Größen von char usw.): http://www.c-plusplus.net/forum/viewtopic-var-p-is-1889286.html#1889286

    SeppJ schrieb:

    Es gibt eine Klasse std::vector<bool>, bei der wird vom Standard garantiert, dass sie (im Rahmen der Möglichkeiten der unterliegenden Architektur) bitweise vorliegende Daten möglichst platzsparend speichert. Das ist dann auch 100% portabel.

    vector<bool> ist der verunglückte Versuch, einen speziell platzsparenden Container für bools zu bauen. Bitweise vorliegende Datenwären vermutlich in einem bitset besser untergebracht. Wenn man denn wirklich um jedes einzelne Bit feilschen muss...



  • SALOMON schrieb:

    Im Prinzip kann es einem doch egal sein, ob ein Typ genau x Bits groß ist, solange der Standard garantiert, dass es nicht weniger als x Bits sind?

    Nun ja, ich kann mir durchaus Situationen vorstellen, in denen man sich auf die Grösse der Datentypen verlassen muss. Zum Beispiel in vielen Fällen, wo reinterpret_cast im Spiel ist. Das bezieht sich zwar meistens auf plattformabhängige Low-Level-Operationen, aber kann eben trotzdem vorkommen.



  • Nexus schrieb:

    SALOMON schrieb:

    Im Prinzip kann es einem doch egal sein, ob ein Typ genau x Bits groß ist, solange der Standard garantiert, dass es nicht weniger als x Bits sind?

    Nun ja, ich kann mir durchaus Situationen vorstellen, in denen man sich auf die Grösse der Datentypen verlassen muss. Zum Beispiel in vielen Fällen, wo reinterpret_cast im Spiel ist. Das bezieht sich zwar meistens auf plattformabhängige Low-Level-Operationen, aber kann eben trotzdem vorkommen.

    zwischen "sich auf die Größe verlassen" und "eine bestimmte Größe explizit zuweisen" ist aber noch ein Unterschied. Ersteres ist wie du gesagt hast meist spezifisch für eine Plattform gedacht, letzteres wäre allgemeingültig/portabel - zumindest würde ich die Frage so interpretieren. Fürs plattformspezifische/sich drauf verlassen gibts #ifdef + #error + CompilerArtDefinierte Makros bzw. dinge wie static_assert/BOOST_STATIC_ASSERT


Anmelden zum Antworten