Rechenoperation

Gast #4802492
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
Gast #4802639
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?
Gast #4802679
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...
Gast #4802682
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.
#4802696
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

Eine eigene Frage? Dieser Thread ist über 9 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.