Unterschied zwischen size_t und unsigned int?

106

Ich bin so verwirrt darüber size_t. Ich habe im Internet gesucht und überall erwähnt, dass size_tes sich um einen vorzeichenlosen Typ handelt, der nur nicht negative Werte darstellen kann.

Meine erste Frage lautet: Wenn es nur nicht negative Werte darstellt, warum verwenden wir nicht unsigned intstattdessen size_t?

Meine zweite Frage lautet: Sind size_tund unsigned intaustauschbar oder nicht? Wenn nicht, warum dann?

Und kann mir jemand ein gutes Beispiel size_tund kurz seine Arbeitsweise geben?

Vikas Verma
quelle
5
typedef /*This part is implementation dependent */ size_t;
P0W
5
mögliches Duplikat von unsigned int vs. size_t

Antworten:

87

Wenn es verwendet wird, um einen nicht negativen Wert darzustellen, warum verwenden wir ihn nicht unsigned intanstelle vonsize_t

Weil unsigned intist nicht der einzige vorzeichenlose Integer-Typ. size_tkönnte jeder unsigned char, unsigned short, unsigned int, unsigned longoder unsigned long long, abhängig von der Implementierung.

Die zweite Frage ist das size_tund unsigned intsind austauschbar oder nicht und wenn nicht, warum dann?

Sie sind aus dem oben erläuterten Grund nicht austauschbar ^^.

Und kann mir jemand ein gutes Beispiel für size_t und seine kurze Arbeitsweise geben?

Ich verstehe nicht ganz, was Sie unter "seiner kurzen Arbeit" verstehen. Es funktioniert wie jeder andere vorzeichenlose Typ (insbesondere wie der Typ, für den es typisiert ist). Es wird empfohlen, diese zu verwenden, size_twenn Sie die Größe eines Objekts beschreiben. Insbesondere der sizeofOperator und verschiedene Standardbibliotheksfunktionen, wie z. B. strlen()return size_t.

Bonus: Hier ist ein guter Artikel über size_t(und den eng verwandten ptrdiff_tTyp). Es ist sehr gut begründet, warum Sie es verwenden sollten.

Santhosh Kumar
quelle
1
Wie genau kann size_tein sein unsigned char? Ist das in dem Standard, dass es erlaubt ist? Ich meine mit dieser Idee, wie könnte man erwarten, dass jemand calloc()(und seine Familie) strlen()usw. benutzt? Das kommt mir absurd vor.
Pryftan
Ich denke size_t, im Standard wird ein "vorzeichenloser Integer-Typ" definiert, aber es muss nicht derselbe sein wie einer von unsigned {char, short, int, long, long long}.
Paul Hankin
80

In C gibt es 5 Standard-Ganzzahltypen ohne Vorzeichen:

  • unsigned char
  • unsigned short
  • unsigned int
  • unsigned long
  • unsigned long long

mit verschiedenen Anforderungen an ihre Größen und Bereiche (kurz gesagt, der Bereich jedes Typs ist eine Teilmenge des Bereichs des nächsten Typs, aber einige von ihnen haben möglicherweise denselben Bereich).

size_tist ein typedef(dh ein Alias) für einen vorzeichenlosen Typ (wahrscheinlich einer der oben genannten, aber möglicherweise ein erweiterter vorzeichenloser Ganzzahltyp , obwohl dies unwahrscheinlich ist). Dies ist der Typ, den der sizeofBediener angibt .

Auf einem System kann es sinnvoll sein, unsigned intGrößen darzustellen. auf einem anderen könnte es sinnvoller sein, unsigned longoder zu verwenden unsigned long long. ( size_tist wahrscheinlich nicht entweder unsigned charoder unsigned short, aber das ist erlaubt).

Der Zweck von size_tbesteht darin, den Programmierer davon zu entlasten, sich Gedanken darüber zu machen, welcher der vordefinierten Typen zur Darstellung von Größen verwendet wird.

Code, der sizeofErträge voraussetzt, unsigned intwäre nicht portabel. Code, der davon ausgeht, dass er a ergibt, size_tist eher portabel.

Keith Thompson
quelle
6
Ich denke, dies sollte die akzeptierte Antwort sein, weil es erklärt, warum Sie size_t
kuchi
@ keith-thompson tut so dies bedeutet , dass die spezifische Art (dh unsigned int, unsigned longusw.), die size_tentspricht , auf dem an der Maschine abhängt , wird der Code ausgeführt? dh auf einer Maschinenarchitektur entspricht es, unsigned intaber auf einer anderen Architektur entspricht es unsigned longusw.?
Richie Thomas
1
@RichieThomas: Das hängt von der C-Implementierung ab. Zwei verschiedene Compiler auf der gleichen Architektur könnten verschiedene Arten für wählen size_t, vor allem , wenn zum Beispiel unsigned longund unsigned long longdie gleiche Größe haben .
Keith Thompson
@RichieThomas Das gehört auch dazu. Das heißt , dass die max long, long longusw. Sie auf dem System abhängig: Wenn Sie einen Blick auf , limits.hSie werden zumindest unter Unices sehen , dass der Maximalwert für ints auf der Wortgröße des Systems abhängt.
Pryftan
1
@Pryftan Schauen Sie sich die Motorola 68000-Serie an, auch die ältere Intel x86-Serie (zurück zu den 8086 und 8088).
Keith Thompson
10

size_t hat eine spezifische Einschränkung.

Zitat aus http://www.cplusplus.com/reference/cstring/size_t/ :

Alias ​​eines der grundlegenden vorzeichenlosen Ganzzahltypen.

Es ist ein Typ, der die Größe eines beliebigen Objekts in Bytes darstellen kann : size_t ist der vom Operator sizeof zurückgegebene Typ und wird in der Standardbibliothek häufig zur Darstellung von Größen und Zählungen verwendet.

Es ist nicht austauschbar mit, unsigned intda die Größe von intvom Datenmodell angegeben wird. Beispielsweise verwendet LLP64 ein 32-Bit intund ILP64 ein 64-Bit int.

DrYap
quelle
5
Woher kommt dieses Zitat? (Es ist nicht vom C-Standard.)
Keith Thompson
2
Frage ist markiert c . Der C ++ - Standard hat keinen Einfluss auf C.
IInspectable
7

size_t wird zum Speichern der Größe von Datenobjekten verwendet und kann garantiert die Größe jedes Datenobjekts enthalten, das von der jeweiligen C-Implementierung erstellt werden kann. Dieser Datentyp kann kleiner (in Anzahl der Bits), größer oder genau derselbe sein wie int ohne Vorzeichen.

Thomas Padron-McCarthy
quelle
4

Neben den anderen Antworten wird auch der Code dokumentiert und den Leuten mitgeteilt, dass Sie über die Größe von Objekten im Speicher sprechen

Ed Heal
quelle
Guter Punkt. An appleist ein Apfel , a size_tist eine Größe ...
dom_beau
2

Der Typ size_t ist ein vorzeichenloser Integer-Basistyp der C / C ++ - Sprache. Dies ist der Typ des Ergebnisses, das vom Operator sizeof zurückgegeben wird. Die Größe des Typs wird so gewählt, dass die maximale Größe eines theoretisch möglichen Arrays eines beliebigen Typs gespeichert werden kann. Auf einem 32-Bit-System benötigt size_t 32 Bit, auf einem 64-Bit-System 64 Bit. Mit anderen Worten, eine Variable vom Typ size_t kann einen Zeiger sicher speichern. Die Ausnahme sind Zeiger auf Klassenfunktionen, dies ist jedoch ein Sonderfall. Obwohl size_t einen Zeiger speichern kann, ist es besser, für diesen Zweck einen anderen vorzeichenlosen Integer-Typ uintptr_t zu verwenden (sein Name spiegelt seine Fähigkeit wider). Die Typen size_t und uintptr_t sind Synonyme. Der Typ size_t wird normalerweise für Schleifenzähler, Array-Indizierung und Adressarithmetik verwendet. Der maximal mögliche Wert des Typs size_t ist die Konstante SIZE_MAX.

user2873459
quelle
1
size_tkann die Größe eines einzelnen Objekts speichern. Ein Zeiger kann auf ein beliebiges Byte eines beliebigen Objekts zeigen. Sie können ein System mit beispielsweise einem 64-Bit-Adressraum haben, der die Größe eines Objekts auf 2 ** 32-1 Byte begrenzt. Es gibt keine Garantie dafür size_tund uintptr_tsind vom gleichen Typ.
Keith Thompson
1

In einfachen Worten ist size_t plattform- und implementierungsabhängig, während unsigned int nur plattformabhängig ist.

Kaushal Billore
quelle