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++
Antwort
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
; oderunsigned 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
.
Interessant. Würden Sie das Zitat bitte mit seiner Online-Webseite verknüpfen, wenn es möglich ist? – deepmax
@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. –
Ich weiß es nicht, aber ich bin interessiert zu wissen, warum es darauf ankommt. –
@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
Ich denke, der Punkt ist 0xffffffff = 4294967295 sind positive Zahlen und passen nicht in ein int. –