2016-11-18 6 views
5

Ich sah dies aus C Primer Plus der 6. Auflage, Kontrollfragen in Kapitel 3.Warum ist 0XAA ein unsigned int und kein int?

Die Frage:

Question Picture

Antwort in Anhang A:

Answer Picture

Hinweis d.0XAA, meine Antwort int konstante, hexadezimal-Format ist, Aber die Antwort ist unsigned int

und ich frage mich, warum

+0

So definiert es die Sprache. Jemand hat irgendwann entschieden, dass es so ist. Sie können nicht wirklich herausfinden warum, außer Sie haben eine Zeitmaschine und können fragen, wer diese Entscheidung vor ein paar Jahrzehnten getroffen hat. – Art

+0

@Art könnten Sie bitte mehr Informationen von C-Standard oder etwas anderes geben? Ich werde schätzen, dass :) –

+0

Hier ist die Referenz, die Sie http://stackoverflow.com/questions/12499592/c-hex-constant-type benötigen – HighPredator

Antwort

5

Das Buch ist falsch.

Suffix ... Octal or Hexadecimal Constant 

None  ... int 
       unsigned int 
       long int 
       unsigned long int 
       long long int 
       unsigned long long int 

u or U ... unsigned int 
       unsigned long int 
       unsigned long long int 

Ihre Konstante 0xAA hat kein Suffix so der obere Teil der obigen Tabelle ist, was gilt: Richtet sich nach C11 6.4.4.1, sind die Art von Integer-Konstanten von hexadezimal aus dieser Tabelle bestimmt. Das bedeutet: Der Compiler überprüft zunächst, ob der Wert in eine int passen kann. Wenn es nicht passt, wird es prüfen, ob es in eine unsigned int und so weiter passt.

Bei jeder bekannten Implementierung von C passt der Wert 0xAA sicherlich in eine int. Die richtige Antwort auf die Frage ist int.

Hätte aber die Konstante 0xAAu gewesen, hätte der untere Teil der zitierten Tabelle angewendet werden müssen und das Ergebnis wäre unsigned int gewesen.

+3

Um zu einer Antwort hinzuzufügen, da Standard erfordert, dass 'INT_MAX' mindestens' + 32767' ist, sind alle hexadezimalen Konstanten ohne Suffix von '0x0' bis' 0x7fff' immer 'int'. – user694733

+0

Dies wurde nicht unter den bekannten Errata aufgeführt, daher habe ich dem Herausgeber eine Errata übermittelt. – Lundin

+0

Vielen Dank für Ihre Antwort mit freundlichen Grüßen^_ ^ –

Verwandte Themen