Was ist eine portable Methode, um den Maximalwert von size_t zu finden?

Lesezeit: 3 Minuten

Ich würde gerne den maximalen Wert von size_t auf dem System wissen, auf dem mein Programm läuft. Mein erster Instinkt war, negative 1 zu verwenden, etwa so:

size_t max_size = (size_t)-1;

Aber ich vermute, es gibt einen besseren Weg oder eine irgendwo definierte Konstante.

  • Das ist ein sehr cleverer Trick, den Sie da haben. +1!

    – Mhmm

    12. August 2010 um 21:49 Uhr

  • Ja, was Sie haben, ist in Ordnung (Sie brauchen übrigens keine Besetzung).

    – Stefan Kanon

    12. August 2010 um 21:56 Uhr

  • @Craig: Ein möglicher Grund könnte sein, dies als ungültigen Wert für a festzulegen size_t Variable eingeben. Zum Beispiel, std::string::npos ist eingestellt auf (size_t)-1 (zumindest in der MSVC-Implementierung).

    – Prätorianer

    13. August 2010 um 3:09 Uhr

  • Kann jemand erklären, was size_t max_size = (size_t)-1; eigentlich und wie? Vielen Dank.

    – Koljunja

    1. Juli 2013 um 12:13 Uhr

  • size_t ist nach dem Standard ein vorzeichenloser Typ. Angenommen, es ist als 32-Bit-Wert definiert. Ein -1 wird als 0xffffffff für einen vorzeichenbehafteten Wert im Zweierkomplement dargestellt. Wenn wir dies jedoch in size_t umwandeln, was ein unsignierter Typ ist, ist es stattdessen der maximale Wert. (size_t)(-1) ist das gleiche wie (size_t)(0xffffffff) auf einem 32-Bit-System. Es ist besser, die -1 zu verwenden, da dies auch funktioniert, wenn es 16-Bit (0xffff) oder 64-Bit ist.

    – Joakim

    15. Februar 2014 um 12:24 Uhr

AnT steht mit Russlands Benutzer-Avatar
AnT steht zu Russland

In C99 existiert eine manifeste Konstante (ein Makro), die aufgerufen wird SIZE_MAX. In C89/90 gibt es jedoch keine solche Konstante.

Was Sie jedoch in Ihrem ursprünglichen Beitrag haben, ist eine perfekt tragbare Methode, um den maximalen Wert von zu finden size_t. Es funktioniert garantiert mit jedem unsignierten Typ.

  • Danke, mein Compiler braucht den Cast, oder es kommt eine Warnung wegen Vorzeichenwechsel bei einer Integer-Konvertierung.

    – Gerechtigkeit

    12. August 2010 um 22:03 Uhr

  • @jamesdlin: Die Umwandlung von vorzeichenbehaftet zu vorzeichenlos ist in C immer genau definiert. Es ist erforderlich, die Regeln der typischen Modulo-Arithmetik ohne Vorzeichen zu befolgen, wobei Modulo gleich dem größten Wert des Zieltyps ohne Vorzeichen plus 1 ist. Also oben Fall wirst du bekommen -1 mod (<max-value> + 1)was immer gerecht ist <max-value>.

    – AnT steht zu Russland

    12. August 2010 um 22:24 Uhr

  • @jamesdlin: §5.2.4.2.1 garantiert das -1 ist darstellbar als ein int. §6.3.1.3 garantiert, dass es in ein gültiges umgewandelt wird size_t Wert.

    – Stefan Kanon

    12. August 2010 um 22:35 Uhr

  • @jamesdlin: Eine andere Möglichkeit, das zu sehen, ist das size_t ist ein vorzeichenloser Typ, daher sind alle Werte gültig. Dies kann keine Fallendarstellung sein, da es keine solche Falle gibt.

    – Jens Gustedt

    13. August 2010 um 6:36 Uhr

  • @jamesdlin: ja, unsignierte Typen sind wirklich einfältig 😉 von “6.2.6.2 Integer types“: If there are N value bits, each bit shall represent a different power of 2 between 1 and 2^N−1.. Bei vorzeichenlosen Integer-Typen sind also wirklich keine Überraschungen möglich.

    – Jens Gustedt

    13. August 2010 um 12:45 Uhr


#define MAZ_SZ (~(size_t)0)

oder SIZE_MAX

Als Alternative zu den in den anderen Antworten vorgeschlagenen Bitoperationen können Sie dies in C++ tun

#include <limits>
size_t maxvalue = std::numeric_limits<size_t>::max()

  • std::numeric_limits<size_t>::max() ist kein constexpr, und es wird von einigen Compilern wie Clang nicht gut optimiert. GCC, ICC und MSC handhaben es gut. Es ist oft besser, bei dem zu bleiben #define.

    – jww

    18. November 2015 um 10:07 Uhr

  • @jww Da sollte sei ein constexpr Version von max() verfügbar: de.cppreference.com/w/cpp/types/numeric_limits/max

    – Unterstrich_d

    23. Oktober 2016 um 18:42 Uhr


Benutzeravatar von Praetorian
Prätorianer

Das size_t max_size = (size_t)-1; Die vom OP vorgeschlagene Lösung ist definitiv die bisher beste, aber ich habe einen anderen, komplizierteren Weg gefunden, dies zu tun. Ich poste es nur aus akademischer Neugier.

#include <limits.h>

size_t max_size = ((((size_t)1 << (CHAR_BIT * sizeof(size_t) - 1)) - 1) << 1) + 1;

Wenn Sie mindestens einen C++11-Compiler annehmen, sollte Ihnen SIZE_MAX zur Verfügung stehen:

http://en.cppreference.com/w/c/types/limits

1420150cookie-checkWas ist eine portable Methode, um den Maximalwert von size_t zu finden?

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

Privacy policy