# Práce s čísly

**Unsigned integer**
- na $n$ bitech lze zobrazit číslo v rozsahu $0 \dots 2^n-1$
- 8 bitů: 0 - 255
- 16 bitů: 0 - 65535
- 32 bitů: 0 - 4 294 967 295
- 64 bitů: 0 - 18 446 744 073 709 551 615

**Signed integer**
- pro záporná čísla se používá doplňkový kód
- na $n$ bitech lze zobrazit číslo v rozsahu $-2^{n-1} \dots 2^{n-1}-1$
- zobrazení na $n$ bytech
	- kladné číslo se odečte od čísla $2^n$
	- např. 1 0000 0000 (256) - 0011 0100 (52) = 1100 1100 (-52)

### Jednoduchá sčítačka

- sčítačka a odčítačka pro 8bitová čísla integer
- kromě 8bitového výsledku generuje dva příznakové bity
	- carry bit (**CY**) - přenos do vyššího řádu
	- overflow (**OV**) - příznak přetečení čísel signed integer
- sčítačka pracuje stejně s čísly unsigned integer i signed integer

**Sčítání čísel unsigned integer**
- pokud při sčítání dojde k přetečení, dostaneme nesprávný výsledek
	- výsledek se nevejde do např. 8bitového zobrazení
- přetečení je indikováno bitem **CY**

**Sčítání čísel signed integer**
- přetečení je indikováno bitem **OV**
	- příznakový bit se nastavuje podle typu operace a znamének operandů a výsledku

| 1. operand | 2. operand | výsledek | operace | OV  |
| ---------- | ---------- | -------- | ------- | --- |
| +          | +          | +        | ADD     | 0   |
| +          | +          | -        | ADD     | 1   |
| -          | -          | -        | ADD     | 0   |
| -          | -          | +        | ADD     | 1   |
| +          | -          | +        | SUB     | 0   |
| +          | -          | -        | SUB     | 1   |
| -          | +          | -        | SUB     | 0   |
| -          | +          | +        | SUB     | 1   |
| +          | -          | x        | ADD     | 0   |
| -          | -          | x        | SUB     | 0   |
| +          | +          | x        | SUB     | 0   |

### Porovnávání čísel integer

- při porovnávání se musí rozlišovat mezi čísly unsigned a signed
- unsigned
	- operace nad a pod (above/below)
- signed
	- operace větší a menší (greater/less)

### BCD kód

- jednoducké dekadické číslice se ukládají v binárním tvaru
- např. 2759:
	- rozvinutý tvar
		- 2: `0000 0010`
		- 7: `0000 0111`
		- 5: `0000 0101`
		- 9: `0000 1001`
	- zabalený tvar
		- 2: `0010`
		- 7: `0111`
		- 5: `0101`
		- 9: `1001`

**Sčítání BCD čísel**
- sčítají se běžnou sčítačkou instrukcí ADD
- sčítačka generuje bit H - přenos mezi 3. a 4. bitem (Half Carry)
- po sečtení BCD čísel se musí provádět dekadická korekce speciální instrukcí DAA (Decimal Adjust Add)

### Čísla v pohyblivé řádové čárce

- před uložením převedena do normalizovaného tvaru
	- $1.dddd\dots d \times 2^{\text{exp}}$
- formát uloženého čísla (podle IEEE 754)
	- podle přesnosti je číslo uloženo na 32 nebo 64 bitech
- části
	- 1 bit - znaménko mantisy
	- 8 (11) bitů - posunutý exponent
	- 23 (52) bitů - mantisa

**Převod čísla do normalizovaného tvaru**
- příklad: normalizace čísla +6.625
	- $+6.625_{10} = 110.101_{2}$
	- normalizovaný tvar: $110.101 = 1.10101 \times 2^2$

**Dvojkový exponent**
- exponent se ukládá na 8 (resp. 11) bitů v posunutém tvaru
- posunutý exponent = exponent + 127

| exponent        | posunutý exponent |
| --------------- | ----------------- |
| zvláštní význam | `1111 1111`       |
| +127            | `1111 1110`       |
| +1              | `1000 0000`       |
| 0               | `0111 1111`       |
| -126            | `0000 0001`       | 
| zvláštní význam | `0000 0000`       |

**Mantisa**
- zobrazuje se v přímém kódu
- číslice 1 před řádovou čárkou se neukládá
- $+1.10101 \times 2^2$
	- `0` `100 0000 1` `101 0100 0000 0000 0000 0000`
	- úplné zobrazení: `0x40D40000`

+ absolutně největší číslo: $2^{128} - \text{LSB}$
	+ `0` `111 1111 0` `111 1111 1111 1111 1111 1111`
+ absolutně nejmenší číslo: $2^-126$
	+ `0` `000 0000 1` `000 0000 0000 0000 0000 0000`

**Speciální kombinace exponent/mantisa**

| exponent    | mantisa     | význam       |
| ----------- | ----------- | ------------ |
| `0000 0000` | `000...0`   | $\pm 0$      |
| `0000 0000` | `... 1 ...` | Denormal     |
| `1111 1111` | `000...0`   | $\pm \infty$ |
| `1111 1111` | `... 1 ...` | NaN          |

**Sčítání**
- před sečtením se čísla musí převést na stejný exponent