Bin grad dabei, mehrere Zahlen miteinander zu kombinieren.
ich wollte von verschiedenen Statusen (0 oder 1) diese in einer Reihe weitergeben.
Ich bin drangescheitert, daß 00000 nicht funktioniert.
Es kommt immer nur 0 raus.
Nun wollt ich n Schritt weitergehen, und dann 10/11, 20/21, etc. machen, das funktioniert soweit,
nur ergibt 3010000 = -27680, bei unsigne long gibt das 37856.
normalerweise sollte 3010000 aber 300000 ergeben.
Was iss da faul?
Das liegt irgendwie an den 10000 auch wenn ich 11000 mache, ich bekomme alles, nur nicht das, was es soll.
wenn ich 100000 oder 1000 mache ist alles ok.
Als ich aber eine For-Schleife machen wollte,um rauszufinden, ab wann er falsch rechnet, stimmt wieder alles.
Die ganze Schleife, alle Rechnungs korrekt, von 30 * 1000 bis 30 * 100000
Serial.print(30 * 10000); gibt -27680
Aber ich brauch das ja in einer Variable, also auch
int var1 = 30;
unsigned long var = var1 * 10000; gibt nicht das, was es sollte.
An den Variablen kanns normal ned liegen, da sind nur zehner Werte drin.
Und die Variable, in der die endgültige Zahl drin sein soll, ist auch ok, denn die Zahl 1020000000 ist ja drin.
Dir muß klar werden, daß immer ERST berechnet wird, und dann erst wird das ergebnis Deiner variablen "mitgeteilt".
wenn Du also
unsigned long ergebnis = 30 * 10000
berechnen läßt, wird zuerst:
30 * 10000
berechnet, also zwei int, das ergebnis ist dann IMMER auch ein int, da kommt es zum überlauf. daß Du dieses "falsche" ergebnis in ein unsigned long schreibst, ändert das nichts mehr. wenn Du allerdings
30 * 100000
berechnen läßt, ist das ein int mal ein long, so ist das ergebnis auch ein long und daher richtig. Du mußt also dafür sorgen, daß einer der faktoren eine zahl ist, die praktisch "groß genug" ist, damit das ergebnis dann auch "reinpaßt". natürlich kannst Du nicht einfach 10000 größer machen, aber wenn Du die 10000 in einer long-varaiablen speicherst , erreichst Du genau das.
oder eben einfacher mit 10000UL, damit ist es ein unsigned long mit inhalt 10000.
Dieser Rechenfehler kommt daher daß Du eine zu große Zahl in eine kleine Variable speichern willst.
eine int-Variable kann eine Zahl zwischen ca -32000 und ca 32000 speichern. Wenn Du einen größere zahl reinschreibst werden die höherwertigen Bits einfach ins nichts geschickt und die 16 unteren Bite in die Variable gespeichert, wobei das höherwertigste Bit das Vorzeichen darstellt.
Daher kommen diese unlogischen Rechenergebnisse.
SkyRanger:
ich wollte von verschiedenen Statusen (0 oder 1) diese in einer Reihe weitergeben.
Kann es sein, daß Du das Binärsystem noch nicht verstanden hast?
Es grenzt schon an eine Vergewaltigung, wenn man einen Arduino 10/11 ausrechnen läßt, wenn man den gewünschten Effekt auch mit Schieben erreichen kann. Also zum Verschicken sowas wie:
unsigned aus = (s0<<0) | (s1<<1) | (s2<<2)...
Serial.print(aus, BIN); //nur zur Kontrolle
Und wenn Dir 0 nicht gefällt, häng noch ein (1<<15) dran.
Auspacken entsprechend:
bool s0 = ein & (1<<0);
bool s1 = ein & (1<<1);
bool s2 = ein & (1<<2);
usw.
Also, wenn wir schon dabei sind, die Mehrzahl von 'der Status' ist auch nicht 'die Stati', sondern 'die Status' - auch wenn's komisch aussieht
Der Duden ist dein Freund
combie:
Heute darf man doch auch bestimmt "Statusse" sagen, oder?
Als Lateiner habe ich schon vor Jahrzehnten festgestellt, daß die korrekte Mehrzahl ebenfalls "Status" ist, nur mit einem langen u (U-Deklination). Auf Altdeutsch würde ich die Dinger "Zustände" nennen, oder auf Neudeutsch "States" :-]
Die Frage nach dem Rechenfehler sollte inzwischen ja hinreichend geklärt sein. Was die ganze Diskussion mit der Weitergabe von Zuständen zu tun hat, ist mir dabei immer noch schleierhaft. Aber solange noch etwas Unterhaltung für die armen Daheimgebliebenen an langweiligen Sonntagen herauskommt...