Unterschied zwischen size_t und unsigned int?

Lesezeit: 6 Minuten

Benutzeravatar von Vikas Verma
Vikas Verma

Ich bin so verwirrt size_t. Ich habe im Internet gesucht und das überall erwähnt size_t ist ein vorzeichenloser Typ und kann daher nur nicht negative Werte darstellen.

Meine erste Frage ist: Wenn es nur zur Darstellung nicht negativer Werte verwendet wird, warum verwenden wir es nicht? unsigned int Anstatt von size_t?

Meine zweite Frage ist: sind size_t und unsigned int austauschbar oder nicht? Wenn nicht, warum dann?

Und kann mir jemand ein gutes Beispiel dafür geben size_t und kurz seine Funktionsweise?

  • typedef /*This part is implementation dependent */ size_t;

    – P0W

    1. November 2013 um 17:50 Uhr

  • mögliches Duplikat von unsigned int vs. size_t

    Benutzer146043

    27. März 2014 um 9:51 Uhr

Wenn es verwendet wird, um einen nicht negativen Wert darzustellen, warum verwenden wir es nicht? unsigned int Anstatt von size_t

Da unsigned int ist nicht der einzige vorzeichenlose ganzzahlige Typ. size_t könnte jeder sein unsigned char, unsigned short, unsigned int, unsigned long oder unsigned long longabhängig von der Implementierung.

Zweite Frage ist die size_t und unsigned int austauschbar sind oder nicht und wenn nicht, warum?

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

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

Ich verstehe nicht ganz, was Sie mit “seiner kurzen Arbeit” meinen. Er funktioniert wie jeder andere unsignierte Typ (insbesondere wie der Typ, für den er typdefiniert ist). Sie werden zur Verwendung ermutigt size_t wenn Sie die Größe eines Objekts beschreiben. Insbesondere die sizeof Operator und verschiedene Standardbibliotheksfunktionen, wie z strlen()Rückkehr size_t.

Bonus: hier ist ein guter Artikel um size_t (und die eng verwandten ptrdiff_t Typ). Es begründet sehr gut, warum Sie es verwenden sollten.

  • Wie genau kann size_t sei ein unsigned char? Ist das im Standard erlaubt? Ich meine, mit dieser Idee, wie könnte man von jemandem erwarten, dass er es benutzt calloc() (und Familie), strlen() etc.? Das erscheint mir absurd.

    – Pryftan

    17. November 2019 um 20:35 Uhr

  • Ich finde size_t ist im Standard als “vorzeichenloser Integertyp” definiert, muss aber nicht mit einem der folgenden identisch sein unsigned {char, short, int, long, long long}.

    – Paul Hankin

    13. Juni 2020 um 7:40 Uhr

  • @Pryftan, zum Beispiel würde eine 8-Bit-Architektur verwendet unsigned char wie size_t. Sie müssen sich keine Gedanken darüber machen, was size_t wird, Compiler kümmern sich je nach Zielarchitektur darum.

    – Ekrem Dinçel

    10. November 2020 um 17:13 Uhr


  • “Die Speichergröße (in Bytes) von size_t wird vom Compiler bestimmt. Der Compiler bestimmt (irgendwie) den am besten geeigneten unsigned Integer-Datentyp, der die größtmögliche Arraygröße (von 1 Byte / kleinste Speichereinheit) aufnehmen kann, die die Architektur / Hardware kann es unterstützen und als typdefinieren Größe_t” – Bitte bestätigen Sie den Wahrheitsgehalt meiner Aussage.

    Benutzer15933960

    23. Dezember 2021 um 9:14 Uhr

Benutzeravatar von Keith Thompson
Keith Thompson

Es gibt 5 Standard-Integertypen ohne Vorzeichen in C:

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

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

size_t ist ein typedef (dh ein Alias) für einen unsignierten Typ (wahrscheinlich einer der oben genannten, aber möglicherweise ein erweiterter vorzeichenloser Integer-Typ, obwohl das unwahrscheinlich ist). Es ist der Typ, der von der geliefert wird sizeof Operator.

Auf einem System kann die Verwendung sinnvoll sein unsigned int um Größen darzustellen; auf der anderen Seite könnte es sinnvoller sein, es zu verwenden unsigned long oder unsigned long long. (size_t wird es wohl auch nicht sein unsigned char oder unsigned shortaber das ist erlaubt).

Der Zweck von size_t ist es, den Programmierer von der Sorge zu befreien die der vordefinierten Typen wird verwendet, um Größen darzustellen.

Code, der davon ausgeht sizeof ergibt ein unsigned int wäre nicht tragbar. Code, der davon ausgeht, dass er a ergibt size_t ist eher tragbar.

  • Ich denke, dies sollte die akzeptierte Antwort sein, weil es erklärt, warum Sie size_t verwenden sollten

    – kuchi

    31. August 2016 um 0:10 Uhr

  • @keith-thompson bedeutet das also, dass der spezifische Typ (dh unsigned int, unsigned longusw.) das size_t entspricht hängt von der Maschine ab, auf der der Code ausgeführt wird? dh auf einer Maschinenarchitektur entspricht es unsigned int aber auf einer anderen Architektur wird es entsprechen unsigned longetc?

    – Richie Thomas

    5. November 2019 um 17:43 Uhr

  • @RichieThomas: Es hängt von der C-Implementierung ab. Zwei verschiedene Compiler auf derselben Architektur können unterschiedliche Typen für auswählen size_tinsbesondere wenn z. unsigned long und unsigned long long sind gleich groß.

    – Keith Thompson

    5. November 2019 um 20:15 Uhr

  • @RichieThomas Das gehört auch dazu. Das heißt, die max long, long long usw. hängen vom System ab: Schau mal bei limits.h Sie werden zumindest unter Unices sehen, dass der maximale Wert für ints von der Wortgröße des Systems abhängt.

    – Pryftan

    17. November 2019 um 21:44 Uhr

  • @Pryftan Schauen Sie sich die Motorola 68000-Serie an, auch die ältere Intel x86-Serie (die auf 8086 und 8088 zurückgeht).

    – Keith Thompson

    19. November 2019 um 20:46 Uhr

Benutzeravatar von DrYap
DrYap

size_t hat eine bestimmte Einschränkung.

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

Alias ​​eines der grundlegenden vorzeichenlosen Integer-Typen.

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

Es ist nicht austauschbar mit unsigned int weil die größe von int wird durch das Datenmodell vorgegeben. Zum Beispiel verwendet LLP64 ein 32-Bit int und ILP64 verwendet ein 64-Bit int.

  • Woher stammt dieses Zitat? (Es ist nicht vom C-Standard.)

    – Keith Thompson

    26. Dezember 2014 um 22:18 Uhr

  • Die Frage ist mit c gekennzeichnet. Der C++-Standard hat keinen Einfluss auf C.

    – Inspektionsfähig

    2. März 2017 um 15:29 Uhr

Abgesehen von den anderen Antworten dokumentiert es auch den Code und teilt den Leuten mit, dass Sie über die Größe von Objekten im Speicher sprechen

size_t wird zum Speichern von Größen von Datenobjekten verwendet und ist garantiert in der Lage, die Größe jedes Datenobjekts aufzunehmen, das die jeweilige C-Implementierung erstellen kann. Dieser Datentyp kann kleiner (in Bits), größer oder genau gleich wie unsigned int sein.

Benutzeravatar von user2873459
Benutzer2873459

Der Typ size_t ist ein vorzeichenloser Integer-Basistyp der C/C++-Sprache. Es ist der Typ des vom sizeof-Operator zurückgegebenen Ergebnisses. Die Größe des Typs wird so gewählt, dass er die maximale Größe eines theoretisch möglichen Arrays eines beliebigen Typs speichern 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 bilden Zeiger auf Klassenfunktionen, aber dies ist ein Sonderfall. Obwohl size_t einen Zeiger speichern kann, ist es besser, für diesen Zweck einen anderen unsigned 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 .

Benutzeravatar von Kaushal Billore
Kaushal Billore

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

1423980cookie-checkUnterschied zwischen size_t und unsigned int?

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

Privacy policy