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
warum willst du das machen? jede Rechnung wird in C immer so ausgeführt als ob man es mit INT macht. Es macht keinen sinn eine zahl kürzer zu casten.
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.