C++-Typ unsigned long int [duplicate]

Lesezeit: 4 Minuten

Benutzer-Avatar
Anders Lind

Ist unsigned long int Äquivalent zu unsigned long ? in C++

Meiner Meinung nach sind sie gleich. Aber ich habe einige Leute gesehen, die immer noch unsigned long int im Code verwenden. Verstehe nicht warum? Kann mir das jemand erklären

#include <stdio.h>

int main() {
    unsigned long int num = 282672; 
    int normalInt = 5;
    printf("");
    return 0;
}

Ja.

long ist nur eine Abkürzung für long int. Das liegt daran, im Prinzip long ist nur ein Qualifizierer (es kann auch zur Verlängerung von a verwendet werden double Datentyp, zum Beispiel)

Aus C++ ISO Standard, Abschnitt 7.1.5.2, eine Tabelle mit äquivalenten Typbezeichnern:

Geben Sie hier die Bildbeschreibung ein

  • Ich sehe, dass in Ihrer Tabelle jeder Typ das weglässt signed Token, außer Zeichen. Ist das Absicht oder ist das ein Fehler in der Tabelle?

    – Rik Schaaf

    27. Mai 2015 um 22:27 Uhr

  • Nein, das ist kein Fehler. Siehe auch stackoverflow.com/a/2054941/478658 und stackoverflow.com/a/87648/478658

    – Sebastian

    18. September 2016 um 6:00 Uhr

  • @RikSchaaf – Nein, es ist kein Fehler. Die Standards legen fest, dass die Implementierung definiert ist, ob char ist ein signed oder unsigned Typ. Und tatsächlich, char ist eigentlich eine unterschiedliche Art von beiden unsigned char und signed char. Dies unterscheidet sich von allen anderen ganzzahligen Typen, die sind signed es sei denn, die unsigned Schlüsselwort verwendet wird.

    – Petrus

    12. August 2017 um 0:28 Uhr

  • @Sebastian Interessant zu wissen. Ich habe die Antworten und Kommentare der beiden Fragen ein wenig durchgelesen, um den Grund dafür zu finden, warum beide existieren. Danke für die Klarstellung.

    – Rik Schaaf

    3. Februar 2018 um 8:51 Uhr

§6.7.2 des C99-Standards gibt die folgende Liste von Typen (dies ist nur ein Auszug):

  • short, signed short, short intoder signed short int
  • unsigned shortoder unsigned short int
  • int, signedoder signed int
  • unsignedoder unsigned int
  • long, signed long, long intoder signed long int
  • unsigned longoder unsigned long int
  • long long, signed long long, long long intoder signed long long int
  • unsigned long longoder unsigned long long int

mit folgendem Zusatzpunkt:

(5) Jeder der durch Kommas getrennten Sätze bezeichnet den gleichen Typ, außer dass es für Bitfelder implementierungsdefiniert ist, ob der Spezifizierer int bezeichnet den gleichen Typ wie signed int oder vom gleichen Typ wie unsigned int.

  • Obwohl dies eine C++-Frage ist;)

    – Sebastian Mach

    2. August 2012 um 15:16 Uhr

  • Ja, C++-Frage mit Code, der enthält stdio.h und verwendet printf 😉

    – Christo Iljew

    2. August 2012 um 15:20 Uhr

  • Richtig 😛 Manchmal schaue ich nur auf die Tags, manchmal nur auf den Code und falle auch darauf herein 😀

    – Sebastian Mach

    2. August 2012 um 18:45 Uhr

  • Die Frage ist sowieso sowohl mit C als auch mit C++ gekennzeichnet.

    – Petrus

    12. August 2017 um 0:30 Uhr

  • Das war es anfangs nicht. Das C-Tag wurde mehr als ein Jahr später hinzugefügt.

    – Christo Iljew

    13. August 2017 um 21:06 Uhr

Benutzer-Avatar
Sebastian Mach

Ja. unsigned, signed, short, long, long long alle sind einfache Typbezeichner für XXX int.

Sehen 7.1 Spezifizierer [dcl.spec] im Standard:

3 [ Note: Since signed, unsigned, long, and short by default imply int, a type-name appearing after one of
those specifiers is treated as the name being (re)declared. [ Example:

void h(unsigned Pc); // void h(unsigned int)

void k(unsigned int Pc); // void k(unsigned int)

—end example ] —Endnote]

und 7.1.6.2 Einfache Typbezeichner [dcl.type.simple]

    Table 10 — simple-type-specifiers and the types they specify

    Specifier(s)            | Type
    ------------------------+---------------------------------
    type-name               | the type named
    simple-template-id      | the type as defined in 14.2
    char                    | “char”
    unsigned char           | “unsigned char”
    signed char             | “signed char”
    char16_t                | “char16_t”
    char32_t                | “char32_t”
    bool                    | “bool” 
    unsigned                | “unsigned int”
    unsigned int            | “unsigned int”
    signed                  | “int”
    signed int              | “int”
    int                     | “int”
    unsigned short int      | “unsigned short int”
    unsigned short          | “unsigned short int”
    unsigned long int       | “unsigned long int”
    unsigned long           | “unsigned long int”
    unsigned long long int  | “unsigned long long int”
    unsigned long long      | “unsigned long long int”
    signed long int         | “long int”

unsigned long int ist jedoch die richtige Typdefinition int kann ignoriert werden.

Ja, sie sind gleich. Sprichwort unsigned long int gibt einfach explizit an, dass es sich um ein int handelt.

Sie können sich jederzeit die Größe des Typs ansehen sizeof(unsigned long int) und sizeof(unsigned long)

Hoffe das hilft.

  • Ich bin mir nicht sicher, was Sie mit “explizit angeben, dass es sich um ein int handelt” meinen. unsigned long int und int sind zwei unterschiedliche Arten. int ist sowohl ein Schlüsselwort als auch der Name eines Typs; der Name unsigned long int verwendet das Schlüsselwort intbezieht sich aber nicht auf den Typ int.

    – Keith Thompson

    16. Oktober 2013 um 17:35 Uhr

  • Ich bin mir nicht sicher, was Sie mit “explizit angeben, dass es sich um ein int handelt” meinen. unsigned long int und int sind zwei unterschiedliche Arten. int ist sowohl ein Schlüsselwort als auch der Name eines Typs; der Name unsigned long int verwendet das Schlüsselwort intbezieht sich aber nicht auf den Typ int.

    – Keith Thompson

    16. Oktober 2013 um 17:35 Uhr

1298370cookie-checkC++-Typ unsigned long int [duplicate]

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

Privacy policy