Kodowanie liczb ujemnych w urządzeniu, algorytm

0

Pewne urządzenie może mi zwrócić po rsie liczbę ujemna zapisaną jak niżej:

-20.667 =[ 33 93 97 82 ]
-1.0 =[ 00 00 99 81 ]

Liczby w nawiasach kwadratowych to liczby zapisane w kodzie BCD, skrajnie po lewej jest najmłodszy bajt, skrajnie po prawej najstarszy. Liczba skrajnie po prawej (82, 81) to zakodowana pozycja przecinka którą już rozgryzłem więc nie trzeba już na nią zwracać uwagi. Samym minusem chyba też nie trzeba zaprzątać sobie głowy bo przed przyjściem odpowiedzi wiem że przyjdzie liczba ujemna. Ale nadal nie mogę rozgryźć w jaki sposób uzyskać 20.667 z ciągu [33 93 97]. Jeśli ktoś lubi zagadki lub spotkał się z takim czymś to będę wdzięczny za podpowiedź.

p.s. Nie mogę dać więcej danych bo sam dysponuje tylko tym co napisałem.

1

100 99 99
-33 -93 -97

07 06 02
Za pierwszym razem jest 100, a potem 99 bo było "pożyczanie". Dla drugiego przykładu też działa.

1

ja bym to przedstawił bardziej wyraźnie, jako odejmowanie (po zamianie kolejności bajtów) w systemie o podstawie 100 od liczby 01 00 00 00(100):

      01  00  00  00
   -      97  93  33
   —————————————————
          02  06  67



      01  00  00  00
   -      99  00  00
   —————————————————
          01  00  00

o tym że wynik ma być ujemny, może decydować 8 na początku czwartego bajtu (ale to już moje zgadywanie).
druga cyfra czwartego bajtu wygląda na ilość cyfr przed przecinkiem (po odrzuceniu początkowych zer), ale to pewnie juz zauważyłeś.

0

Dziękuję panowie, teraz już wszystko jasne. Jeszcze dla wyczerpania tematu,

o tym że wynik ma być ujemny, może decydować 8 na początku czwartego bajtu (ale to już moje zgadywanie).
druga cyfra czwartego bajtu wygląda na ilość cyfr przed przecinkiem (po odrzuceniu początkowych zer), ale to pewnie juz zauważyłeś.

czwarty najstarszy bajt (w ciągu znajdujący się na pozycji najmłodszego) należy traktować jako całość i oznacza tylko pozycje przecinka. Wszystko stanie się dla Ciebie jasne jak zobaczysz kodowanie liczb dodatnich:

100.67 =[ 67 00 01 83 ]
0.00987654 =[ 65 87 09 7E ]

Jeżeli pozycja przecinka oznaczona jest jako '80' to przecinek stoi przed ciągiem, jeżeli pozycja oznaczona jest jako '7F' to liczba zaczyna się od '0.0' po czym następuje zakodowany ciąg, i tak dalej. W kodzie to wygląda tak że odejmuje sobie od tej liczby 128 i mam pozycje przecinka, jeśli wartość wychodzi ujemna to do ciągu dołączam zera w pętli. To że liczba przyjdzie ujemna wiem po typie zapytania jakie wysyłam do urządzenia.
Jeszcze raz dzięki za pomoc.

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