Differenz von a und b ohne Vorzeichen darstellen?
-
Hallo,
ich habe eine Zahl1 und eine Zahl2. Nehmen wir an Zahl2 wäre größer. Ich möchte, dass die Differenz nicht vorzeichenbehaftet ist. Kann man mit unsigned das hinkriegen?
Bsp.
int zahl1 = 100; int zahl2 = 155; printf("%u", (unsigned) zahl1-zahl2); //irgendwie gibt es nicht 55 sondern irgendeine komische Zahl aus.
-
abs(x) gibt den Betrag des integer x zurück.
-
[EDIT]
Mist
-
anfang schrieb:
printf("%u", (unsigned) zahl1-zahl2); //irgendwie gibt es nicht 55 sondern irgendeine komische Zahl aus.
Die Zahl ist nicht komisch, sondern das Zweierkomplement. Mit unsigned gibst Du nur an, wie die Zahl interpretiert werden soll.
-
ein 155-100 führt dazu, dass -55 in 2er Komplement Darstellung gespeichert wird, also 11111111111111111111111111001001
Ein unsigned bedeutet, behandle die Zahl als Binärzahl. Lassen wir das 31. Bit weg, dann hätten wir den Wert 2147483593 (als Binärdarstellung). Hättest du kein (unsigned), dann würde das letzte Bit, das eine 1 ist, dazu führen, dass der Wert 2147483593 - 2^31 = -55 ergäbe. Du hast aber ein (unsigned) davor und deshlab wird das als Binärdarstellung behandelt und 2147483593 + 2^31 = 4294967242 berechnet. Und deshalb bekommst du 4294967242. (unsigned) sagt nur aus, wie das letzte Bit (höherwertigste) zu behandeln ist.
-
was spricht gegen:
if (a < b) diff = b - a; else diff = a - b;
?
-
net: Dass es eine Funktion namens abs gibt, die genau das tut.
-
Bashar schrieb:
net: Dass es eine Funktion namens abs gibt, die genau das tut.
Ich sprech mal für net: Aber nicht auf irgend einem Mikrokontroller, den net mal vor 15 Jahren programmieren musste. P.S. (choose randomly: C++, Linux, C#) ist schlecht.
:p
-
kingruedi schrieb:
Ich sprech mal für net: Aber nicht auf irgend einem Mikrokontroller, den net mal vor 15 Jahren programmieren musste. P.S. (choose randomly: C++, Linux, C#) ist schlecht.
:p
dem kann ich nichts mehr hinzufügen
-
Dann schreibt man sich eine Funktion (oder auf nem Steinzeit-µC ein Makro *g*) die (bzw. das) das tut.
-
Bashar schrieb:
Dann schreibt man sich eine Funktion (oder auf nem Steinzeit-µC ein Makro *g*) die (bzw. das) das tut.
...und die kann man ja 'abs()' taufen
-
net schrieb:
Bashar schrieb:
Dann schreibt man sich eine Funktion (oder auf nem Steinzeit-µC ein Makro *g*) die (bzw. das) das tut.
...und die kann man ja 'abs()' taufen
und dann sofort intrinsic machen.
wir sollten das am besten mal den compilerbauern vorschlagen.
-
Ich stimme net zu. Anfang wollte sicher wissen wie es funkt. Was abs() macht kann man auch in einer Hilfe oder bei Google nachlesen.
-
Bashar schrieb:
net: Dass es eine Funktion namens abs gibt, die genau das tut.
ich dachte sie gibt den betrag eines integers zurück und nicht den betrag der differenz zweier integers.
-
nore schrieb:
ich dachte sie gibt den betrag eines integers zurück und nicht den betrag der differenz zweier integers.
Das muss man nicht kommentieren, oder?
-
nore schrieb:
Bashar schrieb:
net: Dass es eine Funktion namens abs gibt, die genau das tut.
ich dachte sie gibt den betrag eines integers zurück und nicht den betrag der differenz zweier integers.
hast ja recht. ein 'abs' wär dann ungefähr sowas:
#define MEIN_ABS(a) (a<0 ? -a : a)
-
nore schrieb:
ich dachte sie gibt den betrag eines integers zurück und nicht den betrag der differenz zweier integers.
Der war gut.
-
ok, sorry. ich tu's nie wieder.
-
[code]
int abs(int a) {
return a&0x7FFFFFFF;
}
[quote]
-
Die Funktion macht die Annahme, dass
- int 32bit gross ist
- für negative Darstellung "sign- and magnitude" Darstellung verwendet wird.
Zumindest letzteres ist eher selten.