Und noch mal der Standard..^^
-
Aha, Begründung wär nett^^
-
if(must_use_long_if_value_greater_65535_required) printf("Ja."); else printf("Nein.");
-
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?