C hex Konstante Typ

7

Ich habe den folgenden c-Code geschrieben:

%Vor%

Ich kompiliere diesen Code mit gcc 4.6.3 auf meinem x86_64 mit dem Flag -m32. Ich bekomme -1 ausgedruckt, wie ich es erwarten würde, die Verschiebung erfolgt arithmetisch unter Verwendung der Zweierkomplementdarstellung, die zu -1 führt.

Wenn ich jetzt stattdessen

schreibe %Vor%

Ich bekomme 16777215. Ich hätte erwartet, dass diese Konstante als int (vorzeichenbehaftet) interpretiert wird und dann die Verschiebung zur Arithmetik, die wiederum zu -1 führen würde. Ich habe den neuesten C-Standard durchgesehen und ich kann nicht verstehen, warum dies der Fall ist. Irgendwelche Ideen?

    
dschatz 19.09.2012, 17:10
quelle

2 Antworten

10

Gemäß dem C99-Standard (6.4.4.1) sind hexadezimale Konstanten der erste Typ auf dieser Liste, der sie darstellen kann:

%Vor%

Das Hex-Literal 0xFFFFFFFF passt nicht in ein int (das die Werte -0x80000000 bis 0x7FFFFFFF enthalten kann), passt aber in unsigned int und daher ist sein Typ unsigniert. Wenn Sie den vorzeichenlosen Wert 0xFFFFFFFF um 8 nach rechts verschieben, erhalten Sie 16777215 .

    
interjay 19.09.2012, 17:24
quelle
10

Nicht verzierte Integralliterale haben unterschiedliche Typen, je nachdem, ob sie dezimal sind oder nicht (6.4.4.1/5 in C11, Tabelle 6 in C ++ 11):

  • Dezimal-Literale, d. h. [1-9][0-9]* , sind immer signiert.

  • hexadezimale und oktale Literale sind entweder signiert oder unsigniert. Wenn der Wert für einen Typ mit Vorzeichen zu groß ist, aber klein genug, um ihn an den Typ ohne Vorzeichen mit der gleichen Breite anzupassen, ist er vorzeichenlos. (Dies geschieht mit Ihrer Hex-Konstante.)

Negative Ganzzahlen mit der rechten Verschiebung sind implementierungsdefiniert, und Sie erhalten eine Vorzeichenerweiterung. Die Verschiebung des vorzeichenlosen Werts nach rechts ist eine einfache Division durch zwei.

    
Kerrek SB 19.09.2012 17:17
quelle

Tags und Links