Symbolische Konstanten in anderen Typ umwandeln

OP #5473121
Hallo,

für meinen WS2812 Treiber habe ich etliche Berechnungen mit dem 
Präprozessor durchgeführt. Danach frage ich ab, ob das Ergebnis der 
Berechnung negativ geworden ist. In den Berechnungen fließt auch die 
Konstante F_CPU mit ein. Auf den Typ der Konstante habe ich leider 
keinen Einfluss, da diese dem Compiler mit übergeben wird.

Für mich ergibt sich folgendes Problem:

Funktioniert:
1
#define F_CPU   5L
2
#define ZAHL    8
3

4
#if ((F_CPU - ZAHL) < 0)
5
#error
6
#endif

Funktioniert leider nicht:
1
#define F_CPU   5UL
2
#define ZAHL    8
3

4
#if ((F_CPU - ZAHL) < 0)
5
#error
6
#endif

Gibt es irgendeine Möglichkeit den Typ der symbolischen Konstante zu 
ändern?

Gruß Andreas
Andreas B. schrieb:
> user schrieb:
>> #define macht nur eine textuelle Ersetzung, somit hat das keinen
>> Typ
>
> In #if Derektiven kann der Präprozessor auch rechnen. Genau da scheint
> es mir so, als würde das Ergebnis als unsigned Interpretiert, sobald
> eine Konstante unsigned ist.

Das ist nicht nur dort so. Auch außerhalb des Preprozessors wird bei 
einer arithmetischen Operation zwischen unsigned int und signed int 
letzterer auch nach unsigned konvertiert und dann die Operation 
vorzeichenlos durchgeführt. Nur kann man außerhalb des Präprozessors 
casten, so dass beide Operanden signed sind. Der Präprozessor kennt aber 
keine Casts, deswegen geht das bei #if nicht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.