Unterschied zwischen INT_MAX und __INT_MAX__ in C

Lesezeit: 8 Minuten

Benutzeravatar von Magic Thanos
Magischer Thanos

Was ist der Unterschied zwischen den 2? __INT_MAX__ ist definiert, ohne eine Bibliothek hinzuzufügen, soweit ich weiß und INT_MAX ist darin definiert limits.h aber wenn ich die Bibliothek einschließe INT_MAX wird erweitert zu __INT_MAX__ so oder so (oder so sagt VSCode). Warum sollte ich jemals die verwenden limits.h eine, wenn es auf die andere erweitert wird?

  • Es gibt einige gute Informationen über führende Unterstriche in dieser SO-Frage.

    – AdrianHHH

    17. Dezember 2022 um 12:16 Uhr


  • Bitte wenden Sie bestimmte Tags (z. B. welche Sprache) auf Ihre Frage an.

    – MoMo

    22. Dezember 2022 um 15:40 Uhr

  • @MoMo Ich habe das getan, seit ich es gepostet habe wdym?

    – Magischer Thanos

    26. Dezember 2022 um 11:22 Uhr

Benutzeravatar von Andreas Wenzel
Andreas Wenzel

Sie sollten immer verwenden INT_MAXda dies die Makrokonstante ist, die durch den ISO-C-Standard definiert ist.

Die Makrokonstante __INT_MAX__ wird nicht von ISO C spezifiziert, daher sollte es nicht verwendet werden, wenn Sie möchten, dass Ihr Code so ist tragbar. Dieses Makro ist einfach ein Implementierungsdetail des verwendeten Compilers. Andere Compiler werden dieses Makro wahrscheinlich nicht definieren und implementieren INT_MAX auf andere Weise.

Benutzeravatar von dbush
dbusch

__INT_MAX__ ist ein implementierungsdefiniertes Makro, was bedeutet, dass es möglicherweise nicht auf allen Systemen vorhanden ist. Insbesondere GCC definiert dieses Makro, MSVC jedoch nicht.

Auf der anderen Seite, INT_MAX ist durch die C-Norm definiert und garantiert vorhanden limits.h für jeden konformen Compiler.

Verwenden Sie also für die Portabilität INT_MAX.

  • Clang definiert auch INT_MAXals Teil der Funktion „Funktioniert ähnlich wie GCC“,

    – John Dallmann

    17. Dezember 2022 um 18:01 Uhr

  • Ich denke, das ist eher “funktioniert wie ein AC-Compiler” -)

    – gnasher729

    18. Dezember 2022 um 1:16 Uhr

  • @gnasher729: Ich glaube, John Dallman hat geschrieben INT_MAX (mit führenden und nachgestellten Unterstrichen), aber er meinte __INT_MAX__ (mit einschließenden Backticks).

    – Edgar Bonett

    18. Dezember 2022 um 13:12 Uhr

  • test_with_leading_and_trailing_underscores

    – Oskar Skog

    18. Dezember 2022 um 16:32 Uhr

  • Ein könnte Verwenden Sie auch Backslashes: \_\_INT_MAX\_\_ ⇒ __INT_MAX__ oder sogar _\_INT_MAX_\_ ⇒ __INT_MAX__. Aber ja, da wir über Code sprechen, sollten wir Codeformatierung verwenden.

    – Scott – Слава Україні

    18. Dezember 2022 um 20:14 Uhr

Warum sollte ich jemals die limits.h verwenden, wenn sie auf die andere erweitert wird?

limits.h ist serienmäßig und tragbar.

Jede Implementierung der C-Sprache ist frei, den Wert von Makros wie z INT_MAX wie es für richtig hält. Das __INT_MAX__ Wert, den Sie sehen, ist ein Artefakt Ihres speziellen Compilers und vielleicht sogar der speziellen Version des Compilers, den Sie verwenden.

Benutzeravatar von John Dallman
John Dallmann

Um die anderen Antworten zu ergänzen: Wenn Sie Code schreiben, der auf mehreren Plattformen ausgeführt wird, ist es Ja wirklich zahlt sich aus, sich an die Standards zu halten. Wenn Sie dies nicht tun, haben Sie bei einer neuen Plattform viel Arbeit zu tun, um sie anzupassen, und der beste Weg, dies zu tun, besteht normalerweise darin, sie an den Standard anzupassen. Diese Arbeit ist sehr langweilig und uninteressant und es lohnt sich, sie zu vermeiden, indem man die Dinge von Anfang an richtig macht.

Ich arbeite an einem mathematischen Modellierer, der ursprünglich in den 1980er Jahren geschrieben wurde VAX/VMSund unterstützte in seinen frühen Tagen mehrere 68000-Plattformen, darunter Apollo/Domäne. Heutzutage läuft es auf 64-Bit-Windows, Linux, macOS, Android und iOS, von denen keines vorhanden ist existierte wann es erstellt wurde.

Benutzeravatar von lee joe
lee joe

__INT_MAX__ ist ein vordefiniertes Makro im C-Präprozessor, das den Maximalwert eines int-Typs auf einer bestimmten Plattform angibt. Dieser Wert ist implementierungsdefiniert und kann auf verschiedenen Plattformen variieren.

INT_MAX ist eine in der Headerdatei „limits.h“ definierte Konstante, die den Höchstwert eines int-Typs angibt. Es ist wie folgt definiert:

define INT_MAX __INT_MAX__

Die Header-Datei „limits.h“ ist Teil der C-Standardbibliothek und stellt verschiedene Konstanten bereit, die die Grenzen verschiedener Typen angeben, z. B. die Mindest- und Höchstwerte der Typen „int“, „long“ und „long long“.

Der Grund warum INT_MAX ist definiert als __INT_MAX__ Denn __INT_MAX__ ist ein vordefiniertes Makro, das den Maximalwert eines int-Typs auf einer bestimmten Plattform angibt, und INT_MAX ist einfach ein Alias ​​für diesen Wert.

Sie können beide verwenden __INT_MAX__ oder INT_MAX um den maximalen Wert eines int-Typs zu erhalten, aber es wird im Allgemeinen empfohlen, ihn zu verwenden INT_MAX da es in einer Header-Datei einer Standardbibliothek definiert ist und daher besser portierbar ist.

  • __INT_MAX__ ist nicht implementierungsdefiniert. Dieser Begriff bedeutet im Zusammenhang mit C den C-Standard erfordert eine Implementierung, um anzugeben, was die Definition ist. Die C-Norm macht keine solche Anforderung für __INT_MAX__. Eine Implementierung kann definieren __INT_MAX__aber der Begriff „implementierungsdefiniert“ sollte nicht verwendet werden, um dies zu beschreiben.

    – Eric Postpischil

    18. Dezember 2022 um 16:20 Uhr

  • __INT_MAX__ ist ein reservierter Name für die interne Verwendung der Implementierung; Beachten Sie die beiden führenden Unterstriche gefolgt von einem Großbuchstaben. Was Sie beschreiben, ist nur die Implementierungswahl von GCC / glibc. (Wo sie die tatsächliche numerische Konstante in den Compiler einfügen, anstatt verschiedene Versionen von zu benötigen limits.h für Ziele mit 16-Bit intoder 32 vs. 64-Bit long.)

    – Peter Cordes

    19. Dezember 2022 um 19:48 Uhr


  • @EricPostpischil was ist der richtige Begriff für dieses Konzept? Ich hätte “Implementierung definiert” verwendet, um alle Funktionen zu bezeichnen, die eine bestimmte Implementierung unterstützt und dokumentiert, nicht unbedingt etwas, das vom Standard gefordert wird.

    – PC Luddite

    20. Dezember 2022 um 19:05 Uhr

  • @PCLuddite: Meistens würde ich einfach die spezifische Formulierung „implementierungsdefiniert“ vermeiden, da der C-Standard damit Dinge meint, die eine Implementierung definieren muss. Ich könnte sagen „GCC definiert __INT_MAX__ der Maximalwert von an sein int“ oder „Einige C-Implementierungen definieren __INT_MAX__,” usw. Ich bin mir nicht sicher, ob GCC tatsächlich dokumentiert __INT_MAX__ für den normalen Programmierergebrauch. Es kann etwas sein, das für Implementierer von C-Standardbibliotheken definiert wird, um es in den Headern zu verwenden, damit sie schreiben können #define INT_MAX __INT_MAX__ um einen Header zu erstellen, der sich an verschiedene Ziele anpasst…

    – Eric Postpischil

    20. Dezember 2022 um 19:13 Uhr


  • … Im Allgemeinen könnte ich sagen, dass eine Implementierung etwas als Erweiterung definiert oder bestimmte Dinge oder andere Formulierungen angibt, die für das jeweilige Problem geeignet sind. Vermeiden Sie einfach „implementierungsdefiniert“.

    – Eric Postpischil

    20. Dezember 2022 um 19:14 Uhr

Satish Chandra Guptas Benutzeravatar
Satish Chandra Gupta

In der Programmiersprache C INT_MAX ist ein Makro, das auf den maximalen Wert erweitert wird, der in einer Variablen vom Typ int gespeichert werden kann. Dieser Wert ist implementierungsdefiniert, was bedeutet, dass er je nach verwendeter C-Implementierung variieren kann. Auf den meisten Systemen ist int ein 32-Bit-Datentyp und INT_MAX ist definiert als 2147483647, was der maximale Wert ist, der in einer 32-Bit-Zweierkomplement-Ganzzahl gespeichert werden kann.

Auf der anderen Seite, __INT_MAX__ ist ein vordefiniertes Makro, das den maximalen Wert darstellt, der in einer Variablen vom Typ int auf dem System gespeichert werden kann, auf dem das C-Programm kompiliert wird. Mögen INT_MAXder Wert von __INT_MAX__ ist implementierungsdefiniert und kann je nach verwendeter C-Implementierung variieren. Jedoch, __INT_MAX__ wird vom Compiler während der Kompilierung gesetzt, wohingegen INT_MAX ist typischerweise in einer Header-Datei definiert (z. B. Grenzen.h) und zur Laufzeit in das Programm eingebunden.

Im Allgemeinen wird die Verwendung empfohlen INT_MAX eher, als __INT_MAX__ in C-Programmen, wie INT_MAX ist portabel und funktioniert auf jedem System, wohingegen __INT_MAX__ ist spezifisch für das System, auf dem das Programm kompiliert wird.

  • __INT_MAX__ ist nicht implementierungsdefiniert. Dieser Begriff bedeutet im Zusammenhang mit C den C-Standard erfordert eine Implementierung, um anzugeben, was die Definition ist. Die C-Norm macht keine solche Anforderung für __INT_MAX__. Eine Implementierung kann definieren __INT_MAX__aber der Begriff „implementierungsdefiniert“ sollte nicht verwendet werden, um dies zu beschreiben.

    – Eric Postpischil

    18. Dezember 2022 um 16:20 Uhr

  • __INT_MAX__ ist ein reservierter Name für die interne Verwendung der Implementierung; Beachten Sie die beiden führenden Unterstriche gefolgt von einem Großbuchstaben. Was Sie beschreiben, ist nur die Implementierungswahl von GCC / glibc. (Wo sie die tatsächliche numerische Konstante in den Compiler einfügen, anstatt verschiedene Versionen von zu benötigen limits.h für Ziele mit 16-Bit intoder 32 vs. 64-Bit long.)

    – Peter Cordes

    19. Dezember 2022 um 19:48 Uhr


  • @EricPostpischil was ist der richtige Begriff für dieses Konzept? Ich hätte “Implementierung definiert” verwendet, um alle Funktionen zu bezeichnen, die eine bestimmte Implementierung unterstützt und dokumentiert, nicht unbedingt etwas, das vom Standard gefordert wird.

    – PC Luddite

    20. Dezember 2022 um 19:05 Uhr

  • @PCLuddite: Meistens würde ich einfach die spezifische Formulierung „implementierungsdefiniert“ vermeiden, da der C-Standard damit Dinge meint, die eine Implementierung definieren muss. Ich könnte sagen „GCC definiert __INT_MAX__ der Maximalwert von an sein int“ oder „Einige C-Implementierungen definieren __INT_MAX__,” usw. Ich bin mir nicht sicher, ob GCC tatsächlich dokumentiert __INT_MAX__ für den normalen Programmierergebrauch. Es kann etwas sein, das für Implementierer von C-Standardbibliotheken definiert wird, um es in den Headern zu verwenden, damit sie schreiben können #define INT_MAX __INT_MAX__ um einen Header zu erstellen, der sich an verschiedene Ziele anpasst…

    – Eric Postpischil

    20. Dezember 2022 um 19:13 Uhr


  • … Im Allgemeinen könnte ich sagen, dass eine Implementierung etwas als Erweiterung definiert oder bestimmte Dinge oder andere Formulierungen angibt, die für das jeweilige Problem geeignet sind. Vermeiden Sie einfach „implementierungsdefiniert“.

    – Eric Postpischil

    20. Dezember 2022 um 19:14 Uhr

Benutzeravatar von Abhiranjan tiwari
Abhiranjan tiwari

INT_MAX ist ein Makro, das angibt, dass eine Integer-Variable keinen Wert jenseits dieser Grenze speichern kann.

INT_MIN gibt an, dass eine Integer-Variable keinen Wert unterhalb dieser Grenze speichern kann.

Die Werte von INT_MAX und INT_MIN können von Compiler zu Compiler variieren. Im Folgenden sind typische Werte in einem Compiler aufgeführt, in dem Ganzzahlen mit 32 Bit gespeichert werden.

Der Wert von INT_MAX ist +2147483647. Der Wert von INT_MIN ist -2147483648.

  • Okay, aber Sie müssen erklären, wie INT_MAX unterscheidet sich von __INT_MAX__.

    – Null

    22. Dezember 2022 um 20:52 Uhr

1438070cookie-checkUnterschied zwischen INT_MAX und __INT_MAX__ in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy