INT_TO_UINT16
blok funkcyjny w przygotowaniu
1) Przeznaczenie bloku
INT_TO_UINT16 służy do konwersji wartości wejściowej typu INT w Simultusie do wartości 16-bitowej, poprzez zachowanie tylko dwóch najmłodszych bajtów wartości wejściowej.
W Simultusie typ INT na wejściach i wyjściach bloków jest typu int32 (4 bajty), dlatego:
-
na wejściu bloku występuje 4-bajtowa liczba całkowita ze znakiem (int32),
-
w trakcie działania bloku:
-
odrzucane są dwa starsze bajty wartości wejściowej,
-
wykorzystywane są dwa najmłodsze bajty,
-
-
z tych dwóch bajtów tworzona jest wartość 16-bitowa,
-
wynik jest następnie prezentowany na wyjściu jako INT (int32), zawierający wartość z zakresu 16-bitowego.
Blok nie wykonuje klasycznej konwersji matematycznej, lecz operuje na reprezentacji bajtowej wartości wejściowej.
2) Interfejs bloku (wejścia / wyjście)
Wejście
in
Typ: INT (w Simultusie: int32, 4 bajty)
Zakres wejściowy:
[-2147483648 … 2147483647]
Wyjście
out
Typ: INT (w Simultusie: int32, 4 bajty)
Zakres wartości wyjściowej:
[0 … 65535]
Wyjściowa wartość odpowiada 16-bitowej liczbie utworzonej z dwóch najmłodszych bajtów wejścia, zapisanej jako int32.
3) Zasada działania (na poziomie bajtów i bitów)
Blok działa w następujący sposób:
-
Przyjmuje wartość wejściową typu int32 (4 bajty).
-
Odrzuca dwa starsze bajty tej wartości.
-
Zachowuje dwa najmłodsze bajty (16 bitów).
-
Tworzy z nich wartość 16-bitową.
-
Wynik prezentuje na wyjściu jako INT (int32).
Schemat logiczny:
int32 (wejście) ↓ [odrzucenie 2 starszych bajtów] ↓ int16 (logicznie) ↓ int32 (wyjście) Na poziomie bitów:
-
out = in AND 0xFFFF
4) Konsekwencje wynikające z obcinania starszych bajtów
Ponieważ blok wykorzystuje wyłącznie dwa najmłodsze bajty:
-
informacje zawarte w dwóch starszych bajtach wejścia są bezpowrotnie tracone,
-
znak liczby wejściowej nie ma znaczenia dla wyniku,
-
blok nie zachowuje relacji matematycznej między
iniout.
Oznacza to, że:
-
różne wartości wejściowe mogą dać ten sam wynik wyjściowy,
-
wynik zależy wyłącznie od najmłodszych 16 bitów wartości wejściowej.
5) Zakres i interpretacja wyniku
Po konwersji:
-
wynikowa wartość mieści się zawsze w zakresie [0 … 65535],
-
na wyjściu bloku jest ona typu INT (int32), ale:
-
logicznie reprezentuje wartość 16-bitową.
-
Wyjście nie zawiera informacji o znaku ani o starszych bajtach wejścia.
6) Procedura użycia krok po kroku
-
Podłącz wartość typu INT (int32) do wejścia bloku.
-
Traktuj tę wartość jako źródło danych, z którego istotne są tylko dwa najmłodsze bajty.
-
Odczytaj wyjście out jako wartość z zakresu 0…65535.
-
Używaj wyniku jako:
-
wartości 16-bitowej,
-
wartości rejestrowej,
-
składnika dalszych operacji (np. ComposeInt32, ComposeReal4).
-
7) Przykład na konkretnych liczbach
Dane wejściowe:
-
in = 488645668
Postać heksadecymalna (int32):
-
488645668 = 0x1D1A2424
Dwa najmłodsze bajty:
-
0x2424
Interpretacja jako wartość 16-bitowa:
-
0x2424 = 9252
Wynik na wyjściu bloku:
-
out = 9252
Przykład pokazuje, że:
-
dwa starsze bajty (
0x1D1A) są ignorowane, -
wynik zależy wyłącznie od najmłodszych 16 bitów.
8) Jak można wykorzystać blok INT_TO_UINT16
Blok INT_TO_UINT16 stosuje się, gdy:
-
wejściowe dane są dostępne jako INT (int32),
-
logicznie interesuje Cię wartość 16-bitowa zawarta w dwóch najmłodszych bajtach,
-
starsze bajty nie mają znaczenia lub są nośnikiem innych informacji.
Typowe zastosowania:
-
przygotowanie danych do pracy z rejestrami 16-bitowymi,
-
maskowanie starszych bajtów wartości wejściowej,
-
konwersja danych przed użyciem w blokach:
-
ComposeInt32,
-
ComposeReal4,
-
-
praca z protokołami lub urządzeniami, które operują na 16-bitowych rejestrach, przy jednoczesnym użyciu typu INT w Simultusie.