U1 to sposób kodowania liczb całkowitych w urządzeniach elektronicznych. Jego logika jest bardzo podobna do kodowania Znak - Moduł. Tym razem jednak pierwszy znak nie oznacza znaku, a posiada konkretną wartość, która jest następnie dodawana do wartości liczby.
Przypuśćmy, że mamy zapis składajacy się z n bitów. Wtedy do obliczenia wartości tego zapisu skorzystamy ze wzoru: WZM = bn - 1·(-2n-1 + 1) + bn - 2 + .. + b2 + b1 + b0. Przeliczmy na początek kilka przykładów:
Zapis U1 | Przeliczenie | Zakodowana liczba |
---|---|---|
0101 | 0·(-23 + 1) + 22 + 20 = 5 | 5 |
0010 | 0·(-23 + 1) + 21 = 2 | 2 |
1101 | 1·(-23 + 1) + 22 + 20 = -2 | -2 |
1011 | 1·(-23 + 1) + 21 + 20 = -4 | -4 |
Jak można zauważyć jeśli pierwszy bit jest ustawiony na 1 to wartość jest coraz bliższa zera, gdy wartość pozostałych modułów jest coraz większa. Przeciwnie jest z liczbami dodatnimi. W tym przypadku liczba jest coraz bliższa zera, gdy bity prócz pierwszego tworzą jak najmniejszą wartość.
Podany wcześniej wzór pociąga konsekwencje związane z zapisem. Liczby dodatnie to cyfra 0, a następnie moduł zapisany binarnie, ale liczby ujemne trzeba przeliczać w specjalny sposób. Na początek należy obliczyć jej moduł. Potem otrzymaną wartość zamienić na system dwójkowy i dopisać z przodu tyle zer ile bitów ma mieć zapis. Na koniec wystarczy zanegować całe wyrażenie. Spróbujmy przeliczyć kilka wartości dodatnich:
Liczba dziesiętna | Moduł | Kod U1 4bity | Sprawdzenie |
---|---|---|---|
1 | 1 | 0001 | 0·(-23 + 1)+ 20 = 1 |
7 | 111 | 0111 | 0·(-23 + 1) + 22 + 21 + 20 = 7 |
Oraz kilka wartości ujemnych:
Liczba dziesiętna | Moduł | Uzupełnienie | Negacja (Kod U1 4bity) | Sprawdzenie |
---|---|---|---|---|
-1 | 1 | 0001 | 1110 | 1·(-23 + 1) + 22 + 21 = -1 |
-4 | 100 | 0100 | 1011 | 1·(-23 + 1) + 21 + 20 = -4 |
-7 | 111 | 0111 | 1000 | 1·(-23 + 1) = -7 |
Zauważmy, że ponownie zakres danych jaki może przechowywać to kodowanie to [2n - 1 + 1, 2n - 1 - 1]. Można tutaj zauważyć, że 0 ma podwójną reprezentację, ponieważ 111..11ZM = 000..00ZM = 0. Powoduje to, że czasem zero jest "dodatnie", a czasem jest "ujemne".
Dzięki temu, że pierwszy bit posiada konkretną wartość dodawanie dwóch liczb w teorii nie różni się niczym od już znanego dodawania liczb binarnych. Problem pojawa się jednak, gdy liczba przekroczy maksymalną wartość zapisu na n bitach. Wtedy należy dokonać korekty wyniku poprzez dodanie wartości 1.
0 | 0 | 0 | 1 | ||
---|---|---|---|---|---|
+ | 0 | 0 | 1 | 1 | |
0 | 1 | 0 | 0 |
0 | 0 | 1 | 1 | ||
---|---|---|---|---|---|
+ | 1 | 0 | 0 | 1 | |
1 | 1 | 0 | 0 |
Problem pojawa się jednak, gdy liczba przekroczy maksymalną wartość zapisu na n bitach. Wtedy należy dokonać korekty wyniku poprzez dodanie wartości 1. Oto przykładowe działania, które wymagają zastosowania tej reguły:
1 | 0 | 0 | 1 | ||
---|---|---|---|---|---|
+ | 1 | 1 | 1 | 1 | |
1 | 0 | 0 | 1 |
0 | 0 | 1 | 1 | ||
---|---|---|---|---|---|
+ | 1 | 1 | 1 | 0 | |
0 | 0 | 1 | 0 |
W matematyce odejmowanie to inaczej dodawanie liczby przeciwnej. W kodowaniu U1 bardzo łatwo zamienić liczbę na przeciwną. Wystarczy w tym celu jedynie zanegować liczbę. Innymi słowy w celu odjęcia dwóch wartości liczbę odejmowaną zamieniamy na przeciwną i w ten sposób upraszczamy zadanie do dodawania.
1 | 0 | 0 | 1 | ||
---|---|---|---|---|---|
- | 1 | 0 | 1 | 0 | |
1 | 0 | 0 | 1 | ||
+ | 0 | 1 | 0 | 1 | |
1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | ||
---|---|---|---|---|---|
- | 1 | 0 | 0 | 0 | |
1 | 0 | 0 | 0 | ||
+ | 0 | 1 | 1 | 1 | |
1 | 1 | 1 | 1 |
W celu otrzymania liczby przeciwnej wystarczy zanegować wszystkie bity. Warto zauważyć, że negacja wartości zero nie zmienia jego wartości. Rozpatrzmy poniższe przypadki na zapisie 4 bitowym:
Wartość dziesiętna | Zapis U1 | Liczba przeciwna |
---|---|---|
0 | np. 1111 | 0000 |
1 | 0001 | 1110 |
3 | 0011 | 1100 |
-7 | 1000 | 0111 |
Należy pamiętać o tym, że wynik dodawania/odejmowania nie zawsze musi się mieścić w zakresie. Jeśli wynik jest za duży to mówimy o nadmiarze, a jeśli wynik jest za mały to mówimy o niedomiarze. Jak można się spodziewać którykolwiek z tych wyjątków może wystąpić tylko wtedy, gdy znaki są takie same. Wtedy po dodaniu takich liczb pierwszy bit zmieni się na przeciwny. Wykrycie tego jest najprostszym sposobem wykrycia, że wynik nie mógł się zmieścić w określonym zakresie.
0 | 0 | 0 | 1 | ||
---|---|---|---|---|---|
+ | 0 | 1 | 1 | 1 | |
1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | ||
---|---|---|---|---|---|
+ | 1 | 0 | 0 | 1 | |
0 | 1 | 0 | 1 |