Ich möchte den Maximalwert von size_t auf dem System wissen, auf dem mein Programm ausgeführt wird. Mein erster Instinkt war, negative 1 zu verwenden, wie folgt:
size_t max_size = (size_t)-1;
Aber ich vermute, es gibt einen besseren Weg oder eine Konstante, die irgendwo definiert ist.
size_t
Typvariable festzulegen . Zum Beispielstd::string::npos
ist auf(size_t)-1
(zumindest in der MSVC-Implementierung) gesetzt.size_t max_size = (size_t)-1;
eigentlich macht und wie? Vielen Dank.size_t
ist ein vorzeichenloser Typ gemäß dem Standard. Angenommen, es ist als 32-Bit-Wert definiert. Ein -1 wird als 0xffffffff für einen vorzeichenbehafteten Wert unter Verwendung des Zweierkomplements dargestellt. Wenn wir dies jedoch in size_t umwandeln, was ein vorzeichenloser Typ ist, ist es stattdessen der Maximalwert.(size_t)(-1)
ist das gleiche wie(size_t)(0xffffffff)
auf einem 32-Bit-System. Es ist besser, -1 zu verwenden, da dies auch bei 16-Bit (0xffff) oder 64-Bit funktioniert.Antworten:
In C99 existiert eine Manifestkonstante (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 Maximalwert von zu ermitteln
size_t
. Es funktioniert garantiert mit jedem nicht signierten Typ.quelle
-1 mod (<max-value> + 1)
, was immer gerecht ist<max-value>
.-1
als dargestellt werden kannint
. §6.3.1.3 garantiert, dass es in einen gültigensize_t
Wert konvertiert wird.size_t
ein vorzeichenloser Typ, sodass alle Werte gültig sind. Dies kann keine Trap-Darstellung sein, da es keine solche Trap gibt.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..
Für vorzeichenlose Ganzzahltypen sind also wirklich keine Überraschungen möglich.#define MAZ_SZ (~(size_t)0)
oder
SIZE_MAX
quelle
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()
quelle
std::numeric_limits<size_t>::max()
ist kein aconstexpr
und wird von einigen Compilern wie Clang nicht gut optimiert. GCC, ICC und MSC handhaben das gut. Es ist oft besser, bei der zu bleiben#define
.constexpr
Version vonmax()
verfügbar sein: en.cppreference.com/w/cpp/types/numeric_limits/maxDie
size_t max_size = (size_t)-1;
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 akademischen Gründen.#include <limits.h> size_t max_size = ((((size_t)1 << (CHAR_BIT * sizeof(size_t) - 1)) - 1) << 1) + 1;
quelle
Wenn Sie mindestens einen C ++ 11-Compiler annehmen, sollte SIZE_MAX für Sie verfügbar sein:
http://en.cppreference.com/w/c/types/limits
quelle