2013-08-06 18 views
7

Ich verwende RVCT Compiler diesen Code in C (entsprechenden Abschnitt hier) zu kompilieren:Warnung - Integer Operationsergebnis ist in c außerhalb des zulässigen Bereichs

static void Test (void) 
{ 
    unsigned long regVal; 
    regVal |= (UINT32)( (0x1 << 31)  | 
          (0x1 << 26)  | 
          0x3E); 
} 

Wenn Sie den Code kompilieren, erhalte ich die folgende Warnung Warnung : "# 61-D: Ergebnis der Ganzzahloperation liegt außerhalb des Bereichs".

Ich würde gerne verstehen, was zu ändern ist, um die Warnung zu vermeiden.

Vielen Dank im Voraus!

+2

Sie sollten in Erwägung ziehen, 'regVal' zuerst zu initialisieren oder es nur mit dem Operator' = 'anstelle des Operators' | = 'zu initialisieren. – patrickvacek

+1

@patrickvacek, während das ist sicherlich ein gültiger Punkt, ich glaube nicht, dass das der Hauptpunkt dieser Frage ist. –

+0

Ich bin nicht mit diesem Compiler vertraut, aber normalerweise wird diese Variable einen zufälligen Wert annehmen, sie wird NICHT auf 0 initialisiert. Ändern Sie Ihre | = zu = zu vermeiden. – oyvind

Antwort

7

Aufgrund von Integer-Promotion-Regeln wird der innere Ausdruck (d. H. Vor der -Umwandlung) wie signed int behandelt. Daher ist 0x1 << 310x80000000, was eine negative vorzeichenbehaftete Ganzzahl ist, was zu der Warnung führt. Um das zu beheben, können Sie die Verschiebungen vorzeichenlos erzwingen, indem Sie an die Hexadezimalkonstanten "U" anhängen, z. B. 0x1U.

regVal |= (UINT32)( (0x1U << 31)  | 
         (0x1U << 26)  | 
         0x3EU); 

Dadurch werden alle Verschiebungen und bitweise RUP zwingen unsigned zu sein, was der Warnung loswerden sollte (und beseitigt auch die Notwendigkeit, dass die (UINT32) gegossen, da er bereits ohne Vorzeichen ist).

+0

Danke. Durch Hinzufügen von U wurde dieses Problem behoben –

2

Die Compiler-Überlaufwarnung ist korrekt, weil der Ausdruck 1 < < 31 ein int. Zeichen darstellt. Um die Warnung zu vermeiden, definieren Sie explizit die Konstante 0x1 als vorzeichenlosen Wert mit dem U-Postfix. Zum Beispiel:

unsigned long regVal; 
regVal |= (UINT32)( (0x1U << 31)  | 
         (0x1 << 26)  | 
         0x3E); 
Verwandte Themen