Forum: PC-Programmierung C: signed und unsigned Rechenoperationen


von Ora et labora (Gast)


Lesenswert?

Guten Morgen!

Mein Problem: Ich will +,-,* und / Operationen mit unsigned Int und 
signed Int Variablen ausführen. Klappt das, solange ich kein 
Über-/Unterlauf bekomme und das unsigned INT kleiner als 0x8000 ist.

von Rolf Magnus (Gast)


Lesenswert?

Kommt drauf an, was du unter "klappt" verstehst. Die signed-Seite wird 
zunächst nach unsigned konvertiert, und dann wird die Berechnung in 
unsigned durchgeführt.

von Ora et labora (Gast)


Lesenswert?

das hieße, der signed-teil darf nicht negativ sein :(

von Karl H. (kbuchegg)


Lesenswert?

Ora et labora schrieb:
> das hieße, der signed-teil darf nicht negativ sein :(

na ja. dürfen tut er technisch schon.
Nur das Ergebnis ist halt nicht das, was du erwartest.

Durch die trickreiche Konstruktion des 2-er Komplements kannst du das 
Ergebnis wieder einer signed Variablen zuweisen und dann stimmt es sogar 
wieder.

Aber: streng genommen hast du dafür keine Garantie, da C nicht fordert, 
dass ein Computer mit 2-er Komplement rechnet. Theoretisch wäre auch was 
anderes möglich (und war früher, lange vor dem großen Krieg, auch so), 
aber heutzutage läuft praktisch alles auf 2-er Komplement.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Was spricht den dagegen alle unsigned werte in signed zu casten und dann 
zu rechnen?
Die unsigned Eingabedaten dürfen dann natürlich nicht das oberste bit 
nutzen, aber da du ja davon ausgehts, das die Wertebereiche passend 
gewählt sind...

Karl Heinz Buchegger schrieb:
> Durch die trickreiche Konstruktion des 2-er Komplements kannst
> du das  Ergebnis wieder einer signed Variablen zuweisen und
> dann stimmt es sogar wieder.
Daran habe ich auch gedacht, im Prinzip müsste es da doch reichen alle 
negativen Werte im Notfall "per Hand" in 2-er Komplement unsigned ints 
zu konvertieren und dann unsigned weiterzurechnen.

von Rolf Magnus (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ora et labora schrieb:
>> das hieße, der signed-teil darf nicht negativ sein :(
>
> na ja. dürfen tut er technisch schon.
> Nur das Ergebnis ist halt nicht das, was du erwartest.
>
> Durch die trickreiche Konstruktion des 2-er Komplements kannst du das
> Ergebnis wieder einer signed Variablen zuweisen und dann stimmt es sogar
> wieder.

Zumindest bei der Division dürfte das nicht funktionieren.

> Aber: streng genommen hast du dafür keine Garantie, da C nicht fordert,
> dass ein Computer mit 2-er Komplement rechnet. Theoretisch wäre auch was
> anderes möglich (und war früher, lange vor dem großen Krieg, auch so),
> aber heutzutage läuft praktisch alles auf 2-er Komplement.

Insbesondere arbeiten PCs schon immer mit 2er-Komplement.

von Karl H. (kbuchegg)


Lesenswert?

Rolf Magnus schrieb:

>> Durch die trickreiche Konstruktion des 2-er Komplements kannst du das
>> Ergebnis wieder einer signed Variablen zuweisen und dann stimmt es sogar
>> wieder.
>
> Zumindest bei der Division dürfte das nicht funktionieren.

Hast recht.
Ich hatte vergessen, dass er ja alle Operationen durchführen will.
Ich hatte jetzt nur

   i = i + o;

im Hinterkopf, welches auch dann durch das 2-er Komplement funktioniert 
wenn i signed, o unsigned und i negativ ist.

von Daniel -. (root)


Lesenswert?

das habe ich im inet gefunden
gilt das für C und C++?
1
    If both operands have the same type, then no further conversion is needed.
2
3
    Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank is converted to the type of the operand with greater rank.
4
5
    Otherwise, if the operand that has unsigned integer type has rank greater or equal to the rank of the type of the other operand, then the operand with signed integer type is converted to the type of the operand with unsigned integer type.
6
7
    Otherwise, if the type of the operand with signed integer type can represent all of the values of the type of the operand with unsigned integer type, then the operand with unsigned integer type is converted to the type of the operand with signed integer type.
8
9
    Otherwise, both operands are converted to the unsigned integer type corresponding to the type of the operand with signed integer type.

von (prx) A. K. (prx)


Lesenswert?

Vermutlich ja, aber da mein Bildschirm keine 2m breit ist...

Beim ersten Absatz wäre freilich anzumerken, dass dies nicht für 
Operanden unterhalb int/unsigned gilt.

von Sven P. (Gast)


Lesenswert?


von Rolf Magnus (Gast)


Lesenswert?

Sven P. schrieb:
> Ist etwas haarig. Strenggenommen kann noch mehr passieren:

Da geht es um den Überlauf. Das gilt aber nur für vorzeichenbehaftete 
Rechnungen. Im oben Fall würde die Rechnung unsigned durchgeführt, wo es 
laut ISO C keinen Überlauf gibt. Letztendlich war im Ursprungsposting 
die Frage auch nur für die Fälle, in denen es keinen Überlauf gibt, 
gestellt.

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.