subtraction zweier uinsigned 64bit typen

Gast #4947660
Lesenswert?
• ▲
▼
Hallo,

ich muss zwei unsigned 64bit zahlen die als struct in uint8_t typen 
vorliegen subtrahieren.

Das  addieren ist mir so gelungen.
1
    uint16_t partial;
2

3
    partial = a->word0 + b->word0;
4

5
    resultUID->word0 = partial & 0x00FF;
6
    partial = (partial >> 8) + a->word1 + b->word1;
7
    resultUID->word1 = partial & 0x00FF;
8
    partial = (partial >> 8) + a->word2 + b->word2;
9
    resultUID->word2 = partial & 0x00FF;
10
    partial = (partial >> 8) + a->word3 + b->word3;
11
    resultUID->word3 = partial & 0x00FF;
12
    partial = (partial >> 8) + a->word4 + b->word4;
13
  resultUID->word4 = partial & 0x00FF;
14
  partial = (partial >> 8) + a->word5 + b->word5;
15
  resultUID->word5 = partial & 0x00FF;
16
  partial = (partial >> 8) + a->word6 + b->word6;
17
  resultUID->word6 = partial & 0x00FF;
18
  partial = (partial >> 8) + a->word7 + b->word7;
19
  resultUID->word7 = partial & 0x00FF;
20
  
21
  /* if the result overflowed, return nonzero */
22
  return (partial >> 8);

Das carry wird immer wieder übertragen.  Wie man subtrahiert ist mir im 
Prinzip bekannt und das klappt auch auf Papier nur das umsetzen im C 
Code fällt mir schwer. könnte mir jemand dabei helfen ? Im Prinzip muss 
man bloß anderes herum denken.
Gast #4947683
Lesenswert?
• ▲
▼
Auch in bin blöd ;)

man subtrahiert a-b in einen signed 16bit type legt eine Maske mit 0xFF 
drüber und weißt das result->word0 zu.

dann prüft man mit 0x8000 das signed bit und subtrahiert beim nächsten 
a-b-0xff00 von der Differenz    usw usw ..
Gast #4947715
Lesenswert?
• ▲
▼
1
int16_t diff=0;
2
  
3
  diff=a->word0-b->word0;
4
  resultUID->word0=diff&0x00FF;
5
  diff=a->word1-b->word1-(diff&0xFF00);
6
  resultUID->word1=diff&0x00FF;
7
  diff=a->word2-b->word2-(diff&0xFF00);
8
  resultUID->word2=diff&0x00FF;
9
  diff=a->word3-a->word3-(diff&0xFF00);
10
  resultUID->word3=diff&0x00FF;
11
  diff=a->word4-b->word4-(diff&0xFF00);
12
  resultUID->word4=diff&0x00FF;
13
  diff=a->word5-b->word5-(diff&0xFF00);
14
  resultUID->word5=diff&0x00FF;
15
  diff=a->word6-b->word6-(diff&0xFF00);
16
  resultUID->word6=diff&0x00FF;
17
  diff=a->word7-b->word7-(diff&0xFF00);
18
  resultUID->word7=diff&0x00FF;
19
  
20
  if(diff)return 1;
21
  
22
  return 0;

kurz getestet scheint zu funktionieren.
Gast #4948473
Lesenswert?
• ▲
▼
Moin,

man haette die Subtraktion auch als Addition machen koennen.
Invertieren, addieren, +1, fertig. So wird das ja wohl auch in
"echten" (also HW) Rechenwerken umgesetzt.

Aber wozu sollte man 16 Register benoetigen?
Man wuerde doch (wenn es denn unbedingt byteweise sein muss)
byteweise rechnen und wegschreiben, oder?
Wenn man unbegrenzt Register hat und die Speichertransfers
in Register-Gruppen exorbitant schneller waeren als einzeln,
dann OK.
Gast #4948912
Lesenswert?
• ▲
▼
Mal lachen -> es funktioniert so nicht und keinen fiel das auf.

A: ist diff=a->word3-a->word3-(diff&0xFF00); nen Fehler drin und 
zweitens wird das borrow und die Differenz nicht berücksichtigt. Also 
nicht korrekt.

Was funktioniert so lange wie nicht negative wird. Keine Ahnung auf.

Hmm ja man könnte die Additions Funktionen  benutzen :).

Keine Ahnung warum ich an so was simples scheitere man hat sich zu sehr 
daran gewöhnt das alles im Hintergrund abläuft.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren