Arytmetyka 64bit na liczbach 32bit

0

Witam
Interesuje mnie powyższy temat :) Czy mógłby mi ktoś przybliżyć - jakieś linki/algorytmy/itp. ? Tak konkretnie - chodzi mi o dodawanie liczb 32 bitowych w wyniku którego wyjdzie liczba 64 bitowa ...

0

przesunięcia bitowe, czyli przede wszystkim w C++ operatory << i >>

0

Wystarczy użyć typu 64-bitowego:

long long suma = (long long) liczba1 + (long long) liczba2;
0

Hmm, może sprecyzuję dokładniej :) Otóż kompilator (na taki mały mikroprocesor) udostępnia maksymalny rozmiar zmiennej 32 bity (typ long). Nie "umie" typu long long ..... Potrzebuję poskładać ze stringu z ASCII-HEX (coś w rodzaju "506AC0FE") liczbę - niestety nie zmieści mi się ona w 32 bitach. I dlatego potrzebuję kombinacji z liczbą 64bit .....

0

Dodawanie jest bardzo proste. Sumujesz normalnie 32-bitowe składniki, suma to młodsze 32 bity wyniku. Starsze 32 bity wyniku to 0 lub 1 w zależności od flagi przeniesienia.

Dodawanie 64 bitowych liczb podobnie - starsze 32 bity wyniku to suma starszych 32 bitów składników, młodsze 32 bity wyniku to suma młodszych 32 bitów składników, jeśli po tym drugim sumowanie będzie ustawiona flaga przeniesienia to dodajesz jedynkę do starszych 32 bitów.

Poza tym jak jeden kompilator nie potrafi to może inny będzie umiał ?

0

To ja przypomnę jak się mnoży

     73
*    45
--------
     15
    35
    12
+  28
--------
   3285
0
adf88 napisał(a)

(..)jeśli po tym drugim sumowanie będzie ustawiona flaga przeniesienia(..)

proste- jak chcesz w C/C++ sprawdzić flagę przeniesienia ? dla utrudnienia, dodajmy, że nie pracujemy z x86 i nie mamy możliwości operowania w asm.

0

A czy tylko mnie się wydaje czy jeżeli c = a + b, to przy ograniczonym zakresie jeżeli doszło do przeniesienia to zawsze c będzie mniejsze od a? Czy mi się wydaje, czy są też inne możliwe zależności? Można szaleć z haxami z assemblerem ale nie można zapomniać o podstawach matematyki...

0
deus napisał(a)

A czy tylko mnie się wydaje czy jeżeli c = a + b, to przy ograniczonym zakresie jeżeli doszło do przeniesienia to zawsze c będzie mniejsze od a? Czy mi się wydaje, czy są też inne możliwe zależności? Można szaleć z haxami z assemblerem ale nie można zapomniać o podstawach matematyki...
Czemu akurat od "a"? raczej od min(a,b)

0

Ekhm, takie uproszczenie... Siłą suma bez przeniesienia będzie większa od każdego z wyrazów, a z przeniesieniem mniejsza od każdego z nich przy operacjach unsigned. A teraz ja będę czepialski panie Dobrowolski, po skrótach zawierających ostatnią literę kropki się nie stawia.

0

:-D to co mam stawiać?

0
Jacek Rzęsista napisał(a)

Potrzebuję poskładać ze stringu z ASCII-HEX (coś w rodzaju "506AC0FE") liczbę - niestety nie zmieści mi się ona w 32 bitach. I dlatego potrzebuję kombinacji z liczbą 64bit .....
Nie potrzebujesz do tego arytmetyki 64 bit ! Wystarczy, że z ostatnich ośmiu cyfr złożysz jedną liczbę, a z pozostałych drugą. Możesz nawet dowolnie długą liczbę poskładać zamieniając ciąg cyfr na ciąg bajtów (dwie cyfry na bajt).

deus napisał(a)

nie można zapomniać o podstawach matematyki...
No właśnie :) Jeśli podczas sumowanie jest przeniesienie to wynik sumy jest mniejszy od obydwu składników, więc wystarczy sprawdzić tylko jeden (którykolwiek).

_asd napisał(a)

nie mamy możliwości operowania w asm
tego się nie spodziewałem :/ Przecież zawsze jakiś ASM jest ... coś upośledzony ten kompilator.

doc.Habilitowany napisał(a)

:-D to co mam stawiać?
Spację [glowa]
Zresztą mi tam ta kropeczka nie przeszkadza, przecież nikt nie mówił, że skrót oznacza doktora/magistra :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1