ULL-Suffix für ein numerisches Literal

74

Ich bin auf folgenden Code gestoßen:

line += addr & 0x3fULL;

Offensichtlich sind 'U' und 'L' keine hexadezimalen Ziffern. Ich vermute, dass die 'ULL' am Ende dieses hexadezimalen numerischen Literals "Unsigned Long Long" bedeutet - bin ich richtig? (so etwas ist sehr schwer zu googeln) Wenn ja, dann ist dies eine Art Suffix-Modifikator für die Nummer?

aneccodeal
quelle
3
C: N1570 6.4.4.1. C ++: N4700 5.13.2 [lex.icon]. In beiden Sprachen ist das Suffix Groß- und Kleinschreibung (außer , dass lLund Llsind nicht erlaubt) und die LLund Usind separat spezifiziert, so dass Sie alle haben können ull, uLL, Ull, ULL, llu, llU, LLu, LLU.
Keith Thompson
Ping @TonyTannous.
JWW
Beantwortet das deine Frage? Was bedeuten 0LL oder 0x0UL?
3.

Antworten:

70

Aus dem gcc Handbuch :

ISO C99 unterstützt Datentypen für Ganzzahlen mit einer Breite von mindestens 64 Bit (...). long long intFügen Sie LLder Ganzzahl das Suffix hinzu , um eine Ganzzahlkonstante vom Typ zu erstellen. unsigned long long intFügen Sie ULLder Ganzzahl das Suffix hinzu , um eine Ganzzahlkonstante vom Typ zu erstellen.

Diese Suffixe wurden auch in C ++ 11 zu C ++ hinzugefügt und wurden schon lange (Wortspiel beabsichtigt) als Compiler-Erweiterungen unterstützt.

NPE
quelle
2
Das GCC-Handbuch ist etwas veraltet: Es handelt sich nicht mehr um C ++ - Erweiterungen.
MSalters
1
@ MSalters Ich denke, das ist noch gültig vor C ++ 11, oder? Die wahrscheinlich idealere
Jonathan Mee
1
@ JonathanMee: In C ++ 98 waren sie tatsächlich Erweiterungen. Der StackOverflow-Konsens ist jedoch, dass, sofern nicht anders angegeben, die aktuellen Versionen von Software und Standard angenommen werden. Das heißt, das ist jetzt C ++ 14, bald C ++ 17.
MSalters
30

Ja das ist richtig.

  • 0x Präfix macht es zu einem hexadezimalen Literal.
  • ULLSuffix macht es Typ unsigned long long.
Mystisch
quelle
Ich nehme an, es macht den Typ zumindest so, aber da es der größte verfügbare Typ ist, ist das wahrscheinlich dasselbe.
Kerrek SB
Du hast recht. Ich habe es gerade unter long long x = 0xfffffffffffful;Windows getestet und es wird nicht abgeschnitten - auch keine Warnungen.
Mysticial
Alle Literale geben nur die minimal gewünschte Breite an, wobei das absolute Minimum ist int. Aber jedes Literal hat einen Typ, der es unterstützt, wenn überhaupt ...
Kerrek SB
14

Ich stelle eine neue Antwort auf, weil ich erkenne, dass die aktuellen Antworten nicht aus einer plattformübergreifenden Quelle stammen. DasStandard schreibt vor, dass ein Literal mit U/ uund LL/ llSuffixen ein Literal vom Typ ist:unsigned long long int [ Quelle ]

U/ uist das C / C ++ - Suffix für eine vorzeichenlose Ganzzahl.
LL/ llist das C / C ++ - Suffix für eine long longGanzzahl, die in C ++ 11 ein neuer Typ ist und eine Länge von mindestens 64 Bit haben muss.

Anmerkungen:

  1. Das Schlüsselwort intkann weggelassen werden, wenn beispielsweise Modifikatoren verwendet werden unsigned long long. So wird dies definieren oneals eine unsigned long long int, und eine beliebige Nummer zugewiesen werden , static_castum unsigned long long int:unsigned long long one = 1
  2. markiert das Aufkommen von auto. Dadurch wird der Variablentyp auf den Typ festgelegt, der ihm bei der Deklaration zugewiesen wurde. Zum Beispiel, weil 2ULLein unsigned long long intLiteral twodefiniert ist als unsigned long long int:auto two = 2ULL
  3. Ordnungsunabhängige Literalsuffixe eingeführt. Zuvor musste das Suffix U/ uvor jedem Suffix stehen. Aber circaDie Suffixe werden in jeder Reihenfolge akzeptiert. Da dies nun 3LLUein unsigned long long intLiteral ist, threewird es definiert als unsigned long long int:auto three = 3LLU
Jonathan Mee
quelle
2
Weil mein Verstand so funktioniert (aber ich habe kein C ++ 14 zur Hand): Ich nehme an, C ++ 14 erlaubt es nicht 13LUL?
TripeHound
@TripeHound ideone.com hat C ++ 14 und erlaubt kein LUL-Suffix: ideone.com/AWmW8H Dies scheint der Absicht von: en.cppreference.com/w/cpp/language/integer_literal#Explanation
Jonathan Mee zu entsprechen