Symbolische Konstanten in anderen Typ umwandeln

OP #5473121
Lesenswert?
• ▲
▼
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
#5473944
Lesenswert?
• ▲
▼
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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.