Unsigned Short

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

Antwort schreiben

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.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.