Unsigned Short

Gast #2753506
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
Gast #2753511
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.
Moderator Persönliche Seite #2753513
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).
#2753520
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.
#2753528
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.
#2753533
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren