Forum: Mikrocontroller und Digitale Elektronik Unsigned Short


von US (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

ist zwar etwas länger, aber

#define X (unsigned short) 0x1000

würde gehen.

von US (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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).

von (prx) A. K. (prx)


Lesenswert?

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.

von US (Gast)


Lesenswert?

...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.

von (prx) A. K. (prx)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Stefan W. (dl6dx)


Lesenswert?

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
Noch kein Account? Hier anmelden.