C: Eine Heilung für die Warnung: Integerüberlauf im Ausdruck?

8

Ich versuche, meine UART-Bibliothek zu organisieren und sie ein wenig zu verschönern, indem ich ein paar #define s hinzufüge, damit ich sie später anpassen kann, ohne tief in den Code eindringen zu müssen, aber ich scheine das folgende Bit nicht zu bekommen Code funktioniert:

%Vor%

Nach der Berechnung wird BRGVAL zu 25.0416667, und weil es keine ganze Zahl ist, erhalte ich die folgende Warnung, wenn ich das in U1BRG eingib:

  

UART.c: In der Funktion 'uart_init':

     

UART.c: 24: Warnung: Integerüberlauf in Ausdruck

... und der Code funktioniert auf der Zielhardware einfach nicht. (Wenn ich U1BRG = 25 manuell einfüge, funktioniert das wie ein Zauber)

Gibt es eine Möglichkeit, diese Konstante in eine Ganzzahl einzugeben, um den Compiler glücklich zu machen?

Vielen Dank, Hamza.

    
Hamza 27.02.2010, 15:31
quelle

5 Antworten

22

Ganzzahlüberlauf bedeutet, dass Sie die Obergrenze eines int-Werts überschritten haben, der bei diesem Fehler wahrscheinlich 32767 beträgt. Es hat nichts mit Fließkomma zu tun; Bei den von Ihnen angegebenen Operationen handelt es sich tatsächlich um ganzzahlige mathematische Operationen, daher wird der Bruchteil der Division sowieso verworfen.

Versuchen Sie etwas wie folgt:

%Vor%

Das L-Suffix wandelt diese Konstanten in long type anstelle von int type um. Der (unsigned int) -Cast wird in den U1BRG-Typ konvertiert und der Compiler weiß, dass Sie verstehen, dass der long -Wert in ein unsigned int passt und somit alle Warnungen ausblendet, die er Ihnen möglicherweise entgegensetzt.

Normalerweise ist es eine schlechte Übung, Compiler-Warnungen zu deaktivieren, aber in diesem Fall ist es klar, dass, obwohl Sie long benötigen, um Zwischenwerte in der Berechnung zu speichern, das Endergebnis in ein unsigned int passt.

    
Philip Potter 27.02.2010, 15:43
quelle
8

Ich mag Philips Antwort, aber ich denke, eine bessere Lösung besteht darin, die Formel zu reduzieren und Ihr Makro zu ändern:

%Vor%

Dadurch eliminieren Sie die Umwandlung, sodass der Compiler Sie weiterhin warnen kann, wenn Sie eine niedrige Baudrate wählen, die zu einem für einen 16-Bit-Int. zu großen Teilerwert führen würde.

    
tomlogic 27.02.2010 18:16
quelle
0

Ich würde wahrscheinlich das verwenden:

%Vor%     
Segfault 27.02.2010 15:33
quelle
0

Aus Ihrem Beispiel geht nicht klar hervor, ob U1BRG eine globale Variable oder eine # define'ed-Konstante ist. In jedem Fall sollte einfach auf eine Ganzzahl umgesetzt werden:

%Vor%     
JSBձոգչ 27.02.2010 15:35
quelle
0

Sie haben es versäumt, darauf hinzuweisen. Was ist der Datentyp für U1BRG? Wenn es sich um int handelt, kannst du es wie folgt darstellen:

%Vor%

Bearbeiten: Hier wurde der Kommentar von Adam Liss berücksichtigt, dass ein vorzeichenloser int zu klein ist, um das Ergebnis von zu halten das Makro, ich habe es geändert, um es zu einem long ... zu machen. Danke Adam für den Heads-Up ...

Hoffe, das hilft, Freundliche Grüße, Tom.

    
t0mm13b 27.02.2010 15:35
quelle

Tags und Links