mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bedeutung von 'u' in #define DMA0TSEL_5 (5*0x0001u)


Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

könnte mir jemand bitte sagen, was diese Zeile bedeutet:

#define DMA0TSEL_5          (5*0x0001u)

#define-Direktive kenne ich, aber dieser Wert in Klammern, vor allem das 
'u' darin, das verstehe ich nicht.

Vielen Dank vorab!!

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noips schrieb:
> #define-Direktive kenne ich, aber dieser Wert in Klammern, vor allem das
> 'u' darin, das verstehe ich nicht.

Die Berechnung wird dann bereits zur Compilezeit ausgeführt, da ja alle 
Eingangsgrößen zur Berechnung bekannt sind.
Das u steht hierbei für eine "unsigned" Konstante.
Hier wird also 5 mal 1 (hex 0x0001)gerechnet.
:-)

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ich jetzt in einem Beitrag heir gefunden habe, wird der Wert durch 
Anhängen von 'u' unsigned, aber was genau ändert sich dadurch?

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt keine negativen Werte für diese Konstante.

- gerd

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uuups, hab den letzten Post nicht gesehen, bevor ich geschrieben habe. 
Danke für die Antwort!

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gerd schrieb:
> Gibt keine negativen Werte für diese Konstante.

Ist das jetzt so zu verstehen, dass wenn bei define-Direktive ein Wert 
mit angehängtem u steht, dann kann diese Konstante keine negativen Werte 
annehmen? Aber wenn ich die selbst definiere dann behält sie diesen Wert 
immer und 0x0001 ist positiv, ob es mit oder ohne u da steht, oder? 
Warum dann noch u?

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichwort Zweiwerkomplement: 
http://de.wikipedia.org/wiki/Zweierkomplement

Habe gerade irgendwie keine Lust das selbst alles hinzutippern. ;)

- gerd

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, vertippt. Sollte "Zweierkomplement" heissen.

- gerd

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noips schrieb:

> Ist das jetzt so zu verstehen, dass wenn bei define-Direktive ein Wert
> mit angehängtem u steht,

Das hat mit dem #define nicht das Geringste zu tun.

#define macht Textersetzungen. Nicht mehr.
Text A wird durch Text B ersetzt.
Überall dort wo du in deinem Programm im Quelltext den Ausdruck 
DMA0TSEL_5 benutzt, wird dieser Ausdruck vom Präprozessor durch den 
angegebenen Text ersetzt.

Schreibst du
#define DMA0TSEL_5          (5*0x0001u)

int main()
{
  int j = DMA0TSEL_5;
}

dann nimmt sich der Präprozessor diesen Quelltext her und macht die 
Textersetzung. Der eigentliche Compiler bekommt dann das hier zu sehen
int main()
{
  int j = (5*0x1000u);
}

mehr steckt nicht hinter #define.
Das ist einfach nur Textersetzung

> dann kann diese Konstante keine negativen Werte
> annehmen? Aber wenn ich die selbst definiere dann behält sie diesen Wert
> immer und 0x0001 ist positiv, ob es mit oder ohne u da steht, oder?
> Warum dann noch u?

es geht um zb diese Fälle:

schreibst du

unsigned int i = 6 * 10000;

dann hast du in einem 16 Bit System ein Problem.
6 ist ein int. und zwar ein signed int
10000 ist ein int. und zwar ein signed int

Daher wird die Multiplikation auch als signed 16 Bit Multiplikation 
gemacht.
Das geht aber schief. Das theoretische Ergebnis (60000) passt nicht in 
einen 16-Bit signed int, der als Zwischenergebnis entstehen muss, ehe 
dann die Zuweisung gemacht wird.

Machst du aus einem der beiden einen unsigned (such dirs aus ob 6 oder 
10000) dann wird auch die komplette Multiplikation als 16 Bit unsigned 
Multiplikation gemacht und dann passt das Ergebnis wieder in einen 16 
Bit unsigned und kann als solches zugewiesen werden.


Das Durcharbeiten eines C Buches wäre angebracht.

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In deinem Beispiel ist es egal.

#define  BEISPIEL  200u

...

signed char  x = BEISPIEL;   // Fehler

unsigned char  y = BEISPIEL;  // OK

Bei x sollte der Compiler meckern, das die zahl nicht in die Variable 
passt.
Lässt man das u weg, ergiebt das eine negative Zahl in x.


Edit: zu Spät

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verstanden, vielen Dank an alle!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.