2013-04-01 7 views
22

Nach this, sind Ganzzahl Literale ohne Typ Suffix immer int s. Sowohl gcc als auch clang interpretieren 0xffffffff (oder ein beliebiges Literal, das das Vorzeichenbit explizit anders als - setzt) ​​als unsigniert. Welches ist richtig? (Nach this die Compiler sind)Ist das Literal 0xffffffff int oder vorzeichenlos in C++

+0

Ich weiß es nicht, aber ich bin interessiert zu wissen, warum es darauf ankommt. –

+0

@roger_rowland ist es vermutlich nicht, aber clang warnt mich vor einer Umwandlung von unsigned in signed, was ärgerlich ist und was ich nicht verstanden habe – Walter

+0

Ich denke, der Punkt ist 0xffffffff = 4294967295 sind positive Zahlen und passen nicht in ein int. –

Antwort

25

Per Ziffer 2.14.2/2 des C++ 11 Standard

Der Typ eines Ganzzahlliteral ist die erste von der entsprechenden Liste in der Tabelle 6 in welches seinen Wert darstellen kann.

Tabelle 6 berichtet, dass für Hexadezimalkonstanten sollte der Typ sein:

  • int; oder (wenn es nicht passt)
  • unsigned int; oder (wenn es nicht passt)
  • long int; oder (wenn es nicht passt)
  • unsigned long int; oder (wenn es nicht passt)
  • long long int; oder
  • unsigned long long int.

Implementierung Unter der Annahme, hat 32-Bit-int, da 0xffffffff nicht in einem int paßt, soll seine Art unsigned int sein. Für eine Implementierung mit einem 64-Bit int wäre der Typ int.

Beachten Sie, dass, wenn Sie die gleiche wörtlichen als dezimal Konstante anstelle geschrieben hatte, haben die Art konnte nur gewesen:

  • int; oder (wenn es nicht passt)
  • long int; oder (wenn es nicht passt)
  • long long int.
+0

Interessant. Würden Sie das Zitat bitte mit seiner Online-Webseite verknüpfen, wenn es möglich ist? – deepmax

+7

@MM .: Dies ist der C++ 11 Standard (ich benutze Draft 3485, der etwas jünger ist als der offizielle Standard). Der Entwurf kann kostenlos von [hier] heruntergeladen werden (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3485.pdf). Der offizielle Standard ist bezahlt. –