Forum: Mikrocontroller und Digitale Elektronik Rechenoperation


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Dennis (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich programmiere gerade einen AT32UC3B unter Atmel Studio 7 und mir ist 
eins nicht klar. Es geht um die folgende Rechenoperation
1
unsigned short var1 = 0x00;
2
unsigned short var2 = 0x00;
3
4
var1 = var2 - 1U;

Das Ergebnis dieser Rechnung ist var1 = 0xFFFF.
Sollte es nicht aber 0 sein?

Grüße Dennis

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Dennis schrieb:
> Das Ergebnis dieser Rechnung ist var1 = 0xFFFF. Sollte es nicht aber 0
> sein?
Nein, das passt. Stichwort "Unterlauf"...

So ginge das weiter:
0 - 2U = 0xFFFE
0 - 3U = 0xFFFD
0 - 4U = 0xFFFC
0 - 5U = 0xFFFB
0 - 6U = 0xFFFA
0 - 7U = 0xFFF9
0 - 8U = 0xFFF8
:
:

: Bearbeitet durch Moderator
von Besucher (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Der o.g. AT32UC3B kennt durchaus auch Sättigungsarithmetik, allerdings 
gibt's dafür eigene Assemblerfebehle. Wie man die von C aus nutzt - 
k.A... Vielleicht gibt's dafür in irgendeinem Headerfile irgendwelche 
Macros?

von c-hater (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Dennis schrieb:

> Das Ergebnis dieser Rechnung ist var1 = 0xFFFF.

Völlig korrekt.

> Sollte es nicht aber 0 sein?

Wie kommst du denn darauf? Wenn ich von irgendeiner Ganzzahl eins 
abziehe, muss das Ergebnis verschieden von der ursprünglichen Ganzzahl 
sein.

Es sei denn, man benutzt Sättigungs-Arithmetik. Dafür hat C allerdings 
keine Operatoren und man kann sie in C auch nichtmal nachrüsten...

In C++ hingegen ginge das. (Das Nachrüsten entsprechender Operatoren für 
ebenfalls noch zu schaffende "gesättigte" Datentypen). Umsetzen müßte 
man den Kram (wenn er denn effizient sein soll) aber letztlich doch in 
der einzig wahren Sprache: Assembler...

Und das natürlich so, wie es sich gehört und wie es in Wahrheit auch 
fast immer ist: für jede Zielarchitektur anders. Echte Portibilität gibt 
es nicht, und das bissel, was es gibt, resultiert nur aus den 
Fähigkeiten der Compilerbauer (genauer: derjenigen, die die 
Codegeneratoren beisteuern) und der Tatsache, daß wenigstens diese Leute 
neben C/C++/weiss der Fuchs welche abgehobene Sprache auch Assembler 
beherrschen...

Asm rules...

von Adib (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Dennis,

 In C ist bei unsigned das Verhalten von Überlauf und Unterlauf 
definiert.
Bei signed ist das Verhalten nicht definiert.

Dein Beispiel ist also korrektes C.

Hth, Adib.

von F. T. (hansy)


Bewertung
0 lesenswert
nicht lesenswert
Besucher schrieb:
> Wie man die von C aus nutzt -
> k.A... Vielleicht gibt's dafür in irgendeinem Headerfile irgendwelche
> Macros?

Grundsätzlich mit Inline-Assembly. Allerdings wird es wohl in den 
meisten Fällen sinnvoller sein die Sättigung über reinen C-Code selbst 
zu implementieren. Das erfordert zwar mehr Zyklen, dafür bleibt dein 
Code aber auch ohne Weiteres für andere Architekturen portierbar.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.