2010-08-12 8 views
64

Ich möchte den maximalen Wert von size_t auf dem System kennen, auf dem mein Programm läuft. Mein erster Instinkt war wie so negativ 1, zu verwenden:Was ist eine portable Methode, um den maximalen Wert von size_t zu finden?

size_t max_size = (size_t)-1; 

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

+1

Das ein sehr kluger Trick ist die du da hast. +1! – Mhmmd

+0

Ja, was Sie haben, ist in Ordnung (Sie brauchen die Besetzung übrigens nicht). –

+0

Aus Neugier, warum möchten Sie das wissen? –

Antwort

64

In C99 existiert eine manifeste Konstante (ein Makro), die SIZE_MAX heißt. In C89/90 gibt es keine solche Konstante.

Jedoch, was Sie in Ihrem ursprünglichen Beitrag haben, ist eine vollkommen portable Methode, den maximalen Wert von size_t zu finden. Es funktioniert garantiert mit jedem unsignierten Typ.

+0

Vielen Dank, mein Compiler benötigt die Besetzung, oder es wird eine Warnung über die Änderung des Vorzeichens während einer Integer-Konvertierung ausgegeben. – Justicle

+0

Stimmt es, dass es perfekt tragbar ist? Was hindert es daran, eine Trap-Repräsentation zu sein? – jamesdlin

+8

@jamesdlin: Die Konvertierung von vorzeichenbehaftet nach vorzeichenlos ist in C immer gut definiert. Es ist erforderlich, die Regeln der typischen vorzeichenlosen Modulo-Arithmetik mit Modulo gleich dem größten Wert des unsignierten Zielzieltyps plus 1 zu befolgen Im obigen Fall erhalten Sie '-1 mod ( + 1)', was immer nur '' ist. – AnT

12
#define MAZ_SZ (~(size_t)0) 

oder SIZE_MAX

3

Die size_t max_size = (size_t)-1; Lösung durch die OP vorgeschlagen ist definitiv die beste bisher, aber ich habe heraus eine andere, gewunden, Art und Weise, dies zu tun. Ich poste es nur für akademische Neugier.

#include <limits.h> 

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

Wenn ich jemals in einem Code (vor allem ohne einen Kommentar) finden würde, würde es mich sehr mürrisch machen. :) –

4

Als Alternative zu Bit-Operationen in den anderen Antworten vorgeschlagen, könnten Sie dies tun, in C++

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

'std :: numeric_limits :: max()' ist kein 'constexpr', und es wird nicht von einigen Compilern, wie Clang gut optimiert. GCC, ICC und MSC machen es gut. Es ist oft besser, mit dem '# define' zu ​​bleiben. – jww

+1

@jww There _should_ sollte eine 'constexpr'-Version von' max() 'verfügbar sein: http://en.cppreference.com/w/cpp/types/numeric_limits/max –

Verwandte Themen