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