Hallo,
ich habe einen Define-Wert.
#define ZAHL 1000
Ich möchte, dass dies als Unsigned Short sichergestellt wird.
#define ZAHL 1000UL kennt der Compiler (IAR)
#define ZAHL 1000US kennt er leider nicht...
mfg
also ich habe folgenden Code:
#define ZAHL_1 31250
#define ZAHL_2 2500
TA1CCR2 = (ZAHL_1 + ZAHL_2);
Warning[Pe061]: integer operation result is out of range
Warning[Pe068]: integer conversion resulted in a change of sign
Die zweite Warnung kann ich umgehen, wenn ich caste:
TA1CCR2 = (uint16_t)(ZAHL_1 + ZAHL_2);
Beide Warnungen verschwinden, wenn ich
#define ZAHL_1 31250U
#define ZAHL_2 2500U
schreibe, aber ich möchte ja nicht, dass mein Prozessor am Ende mit zu
breiten Registern arbeitet. Das "U" wäre ja irgendwo im Bereich von 4
Byte, ich brauche aber nur 2 Byte.
mfg
US schrieb:> schreibe, aber ich möchte ja nicht, dass mein Prozessor am Ende mit zu> breiten Registern arbeitet. Das "U" wäre ja irgendwo im Bereich von 4> Byte, ich brauche aber nur 2 Byte.
dafür ist optimiere zuständig, er sollte das erkennen. Schau doch mal in
den ASM code. Ich vermute mal stark das immer das gleiche rauskommt.
US schrieb:> also ich habe folgenden Code:>> #define ZAHL_1 31250> #define ZAHL_2 2500>>> TA1CCR2 = (ZAHL_1 + ZAHL_2);
31250 + 2500 = 33750 ist größer als 32767, welche als signed short der
größtmögliche Wert wäre. Deshalb kommt die untenstehende Fehlermeldung:
> Warning[Pe061]: integer operation result is out of range> Warning[Pe068]: integer conversion resulted in a change of sign> Beide Warnungen verschwinden, wenn ich> #define ZAHL_1 31250U> #define ZAHL_2 2500U> schreibe, aber ich möchte ja nicht, dass mein Prozessor am Ende mit zu> breiten Registern arbeitet. Das "U" wäre ja irgendwo im Bereich von 4> Byte, ich brauche aber nur 2 Byte.
Ja und? Es wird sowieso bei der Zuweisung in 16 Bit reingequetscht. Das
Anhängen des U ist vollkommen korrekt. TA1CCR2 wird danach den
gwünschten Wert haben (impliziter Cast).
US schrieb:> schreibe, aber ich möchte ja nicht, dass mein Prozessor am Ende mit zu> breiten Registern arbeitet. Das "U" wäre ja irgendwo im Bereich von 4> Byte, ich brauche aber nur 2 Byte.
Das passt nicht zusammen. Der Ausdruck
31250 + 2500
kann nur dann zu den gezeigten Warnungen führen, wenn der Typ "int" 16
Bits gross ist. Dann aber ist "unsigned" ebenfalls 16 Bits gross.
Andererseits ist es bei Maschinen mit 32 Bits int/unsigned tendentiell
effizienter, mit Wortbreite (32 Bits) statt Teilwortbreite (16 Bits) zu
arbeiten.
...nun es scheint ja voreingestellt der SIGNED SHORT Datentyp angenommen
zu werden.
Es muss doch eine Möglichkeit geben, dem Compiler explizit zu sagen,
dass es eben ein UNSIGNED SHORT ist.
US schrieb:> Es muss doch eine Möglichkeit geben, dem Compiler explizit zu sagen,> dass es eben ein UNSIGNED SHORT ist.
Ja, das gibt es, auch wenn es meist keinen Sinn ergibt. Mit
(unsigned short)31250 + (unsigned short)2500
kriegst du die Warnung nicht, weil das auf einem 16-Bit System effektiv
identisch mit
31250U + 2500U
ist.
Nochmal: Du bist auf dem Holzweg. Es gibt keine C, UC, SC, S und US
Suffixe, weil sie üblicherweise nicht benötigt werden.
US schrieb:> ...nun es scheint ja voreingestellt der SIGNED SHORT Datentyp angenommen> zu werden.
Für was? Wo sollte es eine solche Voreinstellung geben? Es gibt eine
"Voreinstellung" für lexikalische Konstanten auf (mindestens) "int".
Diese "Voreinstellung" nennt sich C-Standard. Und bei 8/16-Bit Maschinen
gilt short=int.
Du scheinst der Ansicht zu sein, dass "int" immer 32 Bits gross sei,
auch wenn die Maschine nur mit 8 oder 16 Bits Breite arbeiten kann. Dem
ist nicht so.
US schrieb:> Das "U" wäre ja irgendwo im Bereich von 4> Byte, ich brauche aber nur 2 Byte.
Wie kommst du darauf?
Der Suffix "U" an einer Integer-Konstanten gibt an, dass es sich um
einen vorzeichenlose (unsigned) Wert handelt. Mehr nicht.
Grüße
Stefan
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.