Forum: Mikrocontroller und Digitale Elektronik Rechnen mit int32, long,


von Mark (Gast)


Lesenswert?

ich muss folgende Rechnung ausrechnen

    x  = ( (0.....255) *     (65535)   )  + (0.....65535)      In Zahlen
int32  = (    (int)    *  (Zahlenwert) )  +    (long) 
Bezeichnung

warum erhalte ich für x nicht den richtigen Wert? Sind diese 
Bezeichnungen inkompatiebel? hat mir jemand eine Idee...?

von Karl H. (kbuchegg)


Lesenswert?

mach da
 65535L
draus. Das L zwingt den Compiler die Zahl als
long anzusehen und daher die Multiplikation
ebenfalls als long Multiplikation auszuführen

von Mark (Gast)


Lesenswert?

hmm.... habe mal was anderes gerechnet:

int32=Dezimalzahl;

Das Ergebniss:
2418083584=500000


aber wieso?

von Karl H. (kbuchegg)


Lesenswert?

> aber wieso?

Ohne dein genaues Programm zu sehen, wird dir wohl
keiner sagen können wo und wie du die C-Regeln verletzt
hast.

Aber ich geb mal eine Vermutung ab:
  =    ist eine Zuweisung
  ==   ist ein Vergleich

if( a = b )
      ^
      |

Das hier ist eine Zuweisung. a wird der Inhalt von
b zugewiesen und anschliessend  wird geprüft, ob
das eine 0 war. Wenn nicht, gilt nach den C-Regeln
das Ergebnis der Zuweisung als wahr und der then-Teil
wird ausgeführt.

In C haben auch Zuweisungen ein Ergebnis! Nämlich die
Zahl, die zugewiesen wurde. Das ermöglicht Konstrukte
wie:
   a = b = c = 5;

von Mark (Gast)


Lesenswert?

Ohne dein genaues Programm zu sehen, wird dir wohl
keiner sagen können wo und wie du die C-Regeln verletzt
hast.

ist unwichtig. Es geht hier lediglich um eine zuweisung eines 
Dezimalwertes zu einem int32 Wert.

von Falk (Gast)


Lesenswert?

@Mark

>>Ohne dein genaues Programm zu sehen, wird dir wohl
>>keiner sagen können wo und wie du die C-Regeln verletzt
>>hast.

>ist unwichtig. Es geht hier lediglich um eine zuweisung eines
>Dezimalwertes zu einem int32 Wert.

Aber nicht in C, da gibt es mehr als genug Stolperfallen.

Aber eine einfache Zuweisung ala

long x;
char a;
long b;
long c;

sollte einfach als

x = (a * b) + c;

funktionieren.

MfG
Falk

von Karl H. (kbuchegg)


Lesenswert?

Mark wrote:
> Ohne dein genaues Programm zu sehen, wird dir wohl
> keiner sagen können wo und wie du die C-Regeln verletzt
> hast.
>
> ist unwichtig. Es geht hier lediglich um eine zuweisung eines
> Dezimalwertes zu einem int32 Wert.

Wenn du meinst.

Du rufst wohl auch beim Arzt an und sagst:
"Herr Doktor, was fehlt mir?"


Aber mal eine ganz andere Frage:
Woher weist du eigentlich, dass die Zuweisung
nicht funktioniert?

von johnny.m (Gast)


Lesenswert?

1
int32_t Ergebnis;
2
int8_t Wert1;
3
int32_t Wert2;
4
5
Ergebnis = ((int32_t)Wert1 * 65535) + Wert2;
Das sollte zumindest das richtige Ergebnis liefern. Ansonsten wird, wie 
von anderen schon angedeutet, jede Berechnung in 16-Bit durchgeführt, 
wenn keiner der Operanden größer als 16 Bit ist. Das Problem ist eben, 
dass bei der Multiplikation beide Werte <= 16 Bit sind...

BTW: Bist Du sicher, dass Du mit genau 65535 multiplizieren willst und 
nicht mit 65536? Sieht mir nämlich fast so aus, als willst Du in den 
oberen 16 Bit den ersten Wert abspeichern und den zweiten 
dazuaddieren...

von Mark (Gast)


Lesenswert?

Ergebniss = (Timerüberlaufzähler) * Timerüberlaufwert(65535) + (das was 
im Timer ist 0.....65535)

Aber mal eine ganz andere Frage:
Woher weist du eigentlich, dass die Zuweisung
nicht funktioniert?

Der Doktor hats mir geflüstert.....

von Karl H. (kbuchegg)


Lesenswert?

Du schnallst es nicht.
Wir wollen dir alle helfen. Aber dazu musst du uns in die
Lage versetzen das zu tun. Dazu gehört auch Information.
Was glaubst du wie oft es vorkommt, dass jemand in einem
Posting beschreibt was er getan hat und wenn man dann
ins Programm schaut, hat er ganz was anderes gemacht
oder irgendeine Nebenbedingung nicht bedacht.

Die Frage: Woher weist du eigentlich ....
hat einen Hintergrund. Es soll schon vorgekommen sein,
dass jemand in seiner Berechnung nach Fehlern suchte
und in Wirklichkeit war sein Ausgabecode fehlerhaft
und die Berechnung völlig in Ordnung.

Du kannst micht beleidigen und dich über mich
lustig machen. Aber hinterher sitzt du immer noch
mit demselben Problem da, dass DU nicht lösen kannst.

Viel Spass beim Knobeln.


(Das grossgeschriebene "DU" ist nicht als Schreien
zu verstehen, sondern als "Anheben der Stimme, zwecks
Betonung")

von tastendrücker (Gast)


Lesenswert?

> warum erhalte ich für x nicht den richtigen Wert?

Da kann man nur Sagen:

Weil Du dem Compiler/Rechner (in einer ihm verständlichen Sprache) nicht 
sagst, was Du haben willst.

von Mark (Gast)


Lesenswert?

Ich möchte mich entschuldigen für meine Aussage. Bin momentan im stress 
und finde neben der Arbeit nur wenig Zeit um mit dem Microcontroller 
weiter zu kommen. Ich werde meinen Code nochmals überprüfen und später 
poasten.

mfg Mark

von Patrick D. (oldbug) Benutzerseite


Lesenswert?


von Herb (Gast)


Angehängte Dateien:

Lesenswert?

Hab's mal durchdebuggt.
Mit dem cast geht's.

MfG

von Herb (Gast)


Lesenswert?

Ooops das war ja die alte Version.

Sieht so aus, als ob es auch so geht.

Warum bei dir nicht?

von Karl H. (kbuchegg)


Lesenswert?

Herb wrote:
> Ooops das war ja die alte Version.
>
> Sieht so aus, als ob es auch so geht.
>
> Warum bei dir nicht?

Hab auf meiner jetzigen Maschine keinen Compiler.
Tust du mir einen Gefallen? Mach mal a zu unsigned int
und lass mal sehen was dann raus kommt.


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.