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
1 | #define DMA0TSEL_5 (5*0x0001u)
|
2 |
|
3 | int main()
|
4 | {
|
5 | int j = DMA0TSEL_5;
|
6 | }
|
dann nimmt sich der Präprozessor diesen Quelltext her und macht die
Textersetzung. Der eigentliche Compiler bekommt dann das hier zu sehen
1 | int main()
|
2 | {
|
3 | int j = (5*0x1000u);
|
4 | }
|
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.