Und noch mal der Standard..^^



  • Du kannst beim Kompillieren (oder sogar noch früher) einen Test sizeof(int)>=4 einbauen. Die Autotools können das beispielsweise.

    Oder typedefst du einen cint (cooky451's int), der das garantiert (normalerweise als int, ansonsten als long).

    Oder du verwendest gleich uint32_t.

    Oder du verwendest die GMP (beliebig grosse Zahlen).



  • der Standard sagt auch nicht das long > int
    Er sagt nur:
    short int <= int <= long int



  • long == long int



  • ist mir durchaus bewusst.
    nur als hinweis, weil der TE meinte mit long garantiert nicht auf diese Beschränkung zu stoßen.

    long und short sind afaik gar keine Datentypen in C, sondern Datentypqualifizierer für int



  • Und was ist mit long double?

    Wie dem auch sei,

    ISO/IEC 9899:1999 6.2.5 (4) schrieb:

    There are five standard signed integer types, designated as signed char, short int, int, long int, and long long int.

    Grenzwerte sind in Anhang E definiert wie folgt:

    ISO/IEC 9899:1999 Annex E (1) schrieb:

    The contents of the header <limits.h> are given below, in alphabetical order. The minimum magnitudes (Hervorhebung von mir) shown shall be replaced by implementation-defined magnitudes with the same sign. The values shall all be constant expressions suitable for use in #if preprocessing directives. The components are described further in 5.2.4.2.1.

    #define     CHAR_BIT                                         8
           #define     CHAR_MAX                    UCHAR_MAX or SCHAR_MAX
           #define     CHAR_MIN                            0 or SCHAR_MIN
           #define     INT_MAX                                     +32767
           #define     INT_MIN                                     -32767
           #define     LONG_MAX                               +2147483647
           #define     LONG_MIN                               -2147483647
           #define     LLONG_MAX                     +9223372036854775807
           #define     LLONG_MIN                     -9223372036854775807
           #define     MB_LEN_MAX                                       1
           #define     SCHAR_MAX                                     +127
           #define     SCHAR_MIN                                     -127
           #define     SHRT_MAX                                    +32767
           #define     SHRT_MIN                                    -32767
           #define     UCHAR_MAX                                      255
           #define     USHRT_MAX                                    65535
           #define     UINT_MAX                                     65535
           #define     ULONG_MAX                               4294967295
           #define     ULLONG_MAX                    18446744073709551615
    

    Wenn dein Programm überall unverändert laufen muss, sind das die Grenzen, an die du dich halten solltest. Programmierst du beispielsweise ausschließlich für PCs, kannst du dich inzwischen wohl auch darauf verlassen, dass int mindestens 4 Byte hat.

    Allerdings: Wenn du feste Breiten brauchst, ist es besser, die entsprechenden Typen aus <stdint.h> zu benutzen.



  • Das ist nur C99, in C89 gibts kein stdint.h nebst uint32_t usw.



  • Fazit: Immer long int und bei printf() %ld zur Ausgabe nutzen?



  • Nein.



  • 314159265358979 schrieb:

    Nein.

    Also deine Antworten sind wirklich die gehaltvollsten im ganzen Forum 👍



  • Du hast dasselbe schon mal gefragt, Idiot.



  • Und deine erste Antwort war ähnlich hilfreich. Lass es einfach wenn du nicht helfen willst oder kannst.

    @ cooky: Wenn du stdint.h nicht hast, dann:

    - dies für jede Architektur/Speichermodell nachbauen
    - oder halt wirklich an die worst-case Garantieen halten



  • Er hat gefragt, ob er immer long verwenden muss, ich sagte nein. Wo liegt dein Problem?


Anmelden zum Antworten