Unterschiedliche Variablengröße



  • In einem Buch steht INT belegt 2 byte, short auch 2 byte, long 4 byte usw... bei mir belegt int 4 byte - kann man nicht exakt bestimmen, wieviel int/short/long belegen dürfen???

    ist dann sonst ein code nicht unberechenbar - auf Unix könnte das dann anders aussehen - oder in zich Jahren wenn neue Hardware kommt auch...

    PS: habe GCC



  • wieviel eine Variable belegt hängt davon ab, wie breit der Datenbus vom Prozessor ist. Heute verwendet man meistens 32bit-Prozessoren. Somit wird für int 4 Byte benötigt.



  • Der sizeof-Operator liefert die Größe eines Typs oder einer Variable in Byte, wobei C ein Byte als ein char festlegt ('sizeof (char)' ist also immer 1). Jedes Byte hat minimal 8 Bits. Nur weil sizeof(int) aber 5 und CHAR_BIT (dieses Makro aus limits.h sagt dir, wieviel Bits ein char und damit ein Byte hat) 9 ist, heißt das aber nicht, dass der Wertebereich von int 5*9 Bits (also von -17592186044416 bis zu 17592186044415) nutzbar machen kann, denn fast alle Typen können Pading-Bits enthalten (auch wenn sie das 'in der Praxis' eher selten tun). Darum wählt man in C gewöhnlich eine andere Vorgehensweise um die Wertebereiche von Zahlen zu bestimmen. Die Norm macht Vorgaben, auf die man sich auf alle Fälle verlassen kann, also das absolute Minimalprogramm also:

    signed char:                  -127 (SCHAR_MIN)                     127 (SCHAR_MAX)
    unsigned char:                   0                                 255 (UCHAR_MAX)
    short:                      -32767 (SHRT_MIN)                    32767 (SHRT_MAX)
    unsigned short:                  0                               65535 (USHRT_MAX)
    int:                        -32767 (INT_MIN)                     32767 (INT_MAX)
    unsigned int:                    0                               65535 (UINT_MAX)
    long:                  -2147483647 (LONG_MIN)               2147483647 (LONG_MAX)
    unsigned long:                   0                          4294967295 (ULONG_MAX)
    long long:    +9223372036854775807 (LLONG_MIN)    -9223372036854775807 (LLONG_MAX)
    unsigned long long:              0                18446744073709551615 (ULLONG_MAX)
    

    Wie groß der Wertebereich der Zahlen bei dir ist, kannst Du herausfinden, indem Du die, in Klammern angegebenen, Konstanten aus limits.h betrachtest. Warum 'unsigned'-Typen keine Konstante für den Minimalbereich haben, sollte relativ leicht ersichtlich sein.
    Aber weil es Leute gibt, denen das immer noch nicht reicht, hat man in C noch einen Header, stdint.h, eingeführt, damit man Typen noch exakter auswählen kann.
    Eigentlich ist das alles aber nicht so wirklich interessant, darum kommt man in den meisten Fällen mit int oder unsigned aus und kümmert sich nicht um so langweilige Low-Level-Probleme wie Überläufe oder so.

    btw: Das Buch kommt mir verdächtig vor. Du solltest es nicht unbedingt weiterlesen, denn es scheint sehr fehlerbehaftet zu sein. Den Typ INT zB konnte ich mit meinem C-Compiler nicht benutzten.



  • Soweit ich weis braucht char 1 byte, ein short 2 byte und int 4 byte.
    Will mich da aber net festlegen



  • Original erstellt von Cypher:
    Soweit ich weis braucht char 1 byte, ein short 2 byte und int 4 byte.

    Daniel E. hat schon recht.
    Die größe der Datentypen ist nirgendwo festgelegt.



  • Du hast schon recht nur gibt es minimale grenzen die immer vorhanden sein müssen.
    Die genauen grenzen kenn ich aber nicht auswendig 😃



  • Original erstellt von quizzmaster:
    Du hast schon recht nur gibt es minimale grenzen die immer vorhanden sein müssen.

    AFAIR gilt nur
    char==1
    char<=short<=int<=long<=long long



  • also ich werde auf jeden fall auf int verzichten, weil es unberechenbar ist - char/short/long sind scheinbar gut standardisiert...

    was ist jetzt mit long long und double long - bei einigen ist es 4 und 8 byte groß - bei mir 8 und 12 byte... hm



  • Original erstellt von <Upsi>:
    **also ich werde auf jeden fall auf int verzichten, weil es unberechenbar ist - char/short/long sind scheinbar gut standardisiert...
    **

    Ich empfehle da die typedef-herangehensweise. Du checkst einmal ab, wie es auf deinem compielr steht mit den größen. Dann machst du dinge wie:

    typedef char int8;
    typedef short int16;
    typedef int int32;
    typedef long int64;

    etc. Die kommen in eine eigene .h-Datei und können so blitzschnell portiert werden.

    Pauschal auf int zu verzichten ist keine gute idee, denn int ist die native Datengröße des Prozessors. Wenn du darauf verzichtest, muss der Prozessor bei jeder Berechnung Daten hin und her konvertieren. Das drückt die Performance.

    [ Dieser Beitrag wurde am 29.03.2003 um 13:22 Uhr von TriPhoenix editiert. ]


Anmelden zum Antworten