diff --git a/course/en/07-unsigned-integers.md b/course/en/07-unsigned-integers.md new file mode 100644 index 0000000..03ab223 --- /dev/null +++ b/course/en/07-unsigned-integers.md @@ -0,0 +1,31 @@ +# Unsigned integers + +An **unsigned** integer uses every bit to represent a non-negative magnitude. + +## PREDICT + +What is the largest value that fits in eight bits? + +## STEP + +With (n) bits there are (2^n) patterns, giving the unsigned range `0 ... 2^n - 1`. + +Eight bits represent 0–255, 16 bits 0–65,535, and 32 bits 0–4,294,967,295. + +`11111111₂ = FF₁₆ = 255₁₀` when interpreted as unsigned eight-bit data. + +## Overflow and wraparound + +Fixed-width arithmetic cannot represent every integer. Under modulo-(2^n) arithmetic, keeping only eight bits makes `255 + 1` wrap to 0. + +## OBSERVE + +The bits alone do not say “unsigned”. Their interpretation depends on the type and width supplied by context. + +## EXPLAIN + +Width and interpretation matter when reading registers, protocols, file formats and machine code. + +## Check yourself + +Find the range of a 12-bit unsigned integer and compute `250 + 10` with eight-bit wraparound. diff --git a/course/en/08-signed-integers.md b/course/en/08-signed-integers.md new file mode 100644 index 0000000..271e48a --- /dev/null +++ b/course/en/08-signed-integers.md @@ -0,0 +1,27 @@ +# Signed integers + +Negative integers require an agreed interpretation of bit patterns. + +## PREDICT + +Can `11111111₂` mean both 255 and −1? + +## STEP + +**Sign-magnitude** reserves a sign bit and therefore has both +0 and −0. + +**Ones' complement** forms a negative value by inverting every bit and also has two zero encodings. + +**Two's complement** is the standard modern integer representation. For (n) bits its range is `-2^(n-1) ... 2^(n-1)-1`. Eight bits therefore cover −128 through 127. + +## OBSERVE + +The same byte `FF₁₆` is 255 as unsigned eight-bit data and −1 as signed eight-bit two's complement. + +## EXPLAIN + +Meaning requires context: width, signedness and encoding rule. Raw bits do not carry those labels themselves. + +## Check yourself + +What is the signed 16-bit two's-complement range? Explain the asymmetry around zero. diff --git a/course/en/09-twos-complement.md b/course/en/09-twos-complement.md new file mode 100644 index 0000000..c04c18e --- /dev/null +++ b/course/en/09-twos-complement.md @@ -0,0 +1,33 @@ +# Two's complement in practice + +Two's complement lets binary addition hardware operate naturally on positive and negative integers. + +## PREDICT + +How can `11111011₂` represent −5? + +## STEP + +To encode −5 in eight bits, write +5 as `00000101`, invert the bits to `11111010`, then add one to obtain `11111011` or `FB₁₆`. + +For an (n)-bit pattern whose top bit is one, another interpretation method is unsigned-value minus (2^n): `251 - 256 = -5`. + +## Addition + +`00000101 + 11111011 = 1 00000000`. Discarding the carry beyond eight bits leaves zero. + +## The minimum-value edge case + +Negation is invert-plus-one, but signed eight-bit −128 has no representable +128 counterpart. Code must account for this boundary case. + +## OBSERVE + +Carry and signed overflow answer different questions, so CPUs may expose separate flags for them. + +## EXPLAIN + +Two's complement is naturally understood as modulo-(2^n) arithmetic plus a signed interpretation of the bit patterns. + +## Check yourself + +Encode −1, −42 and −128 as eight-bit hexadecimal. Interpret `80₁₆` as both unsigned and signed. diff --git a/course/no/07-unsigned-heltall.md b/course/no/07-unsigned-heltall.md new file mode 100644 index 0000000..2b92914 --- /dev/null +++ b/course/no/07-unsigned-heltall.md @@ -0,0 +1,42 @@ +# Unsigned heltall + +Et **unsigned** heltall bruker alle bitene til størrelsen på en ikke-negativ verdi. + +## PREDICT + +Hva er den største verdien som kan lagres i åtte bit? + +## STEP + +Med (n) bit finnes (2^n) mønstre. For unsigned heltall representerer de verdiene + +`0 ... 2^n - 1`. + +Dermed er områdene blant annet: + +| Bredde | Område | +|---:|---:| +| 8 bit | 0–255 | +| 16 bit | 0–65 535 | +| 24 bit | 0–16 777 215 | +| 32 bit | 0–4 294 967 295 | + +`11111111₂ = FF₁₆ = 255₁₀` som unsigned 8-bit-verdi. + +## Overflow og wraparound + +En fast bitbredde kan ikke representere vilkårlig store verdier. I modulo-(2^n)-aritmetikk vil en verdi som passerer maksimum gå rundt: + +`255 + 1 = 0` for en 8-bit unsigned verdi dersom bare de nederste åtte bitene beholdes. + +## OBSERVE + +Bitmønsteret endrer ikke betydning av seg selv. `FF₁₆` er bare 255 dersom vi vet at mønsteret tolkes som unsigned. + +## EXPLAIN + +Datatypen og bitbredden er en del av betydningen. Dette er avgjørende når du leser registre, protokollfelt, filer eller maskinkode. + +## Sjekk deg selv + +Finn området for 12-bit unsigned og beregn hva `250 + 10` blir med 8-bit wraparound. diff --git a/course/no/08-signed-heltall.md b/course/no/08-signed-heltall.md new file mode 100644 index 0000000..fd74b1d --- /dev/null +++ b/course/no/08-signed-heltall.md @@ -0,0 +1,38 @@ +# Signed heltall + +For å representere negative heltall må bitmønstrene få en avtalt signed-tolkning. + +## PREDICT + +Kan bitmønsteret `11111111₂` bety både 255 og −1? + +## STEP + +Historisk finnes flere representasjoner. + +**Sign-magnitude** bruker én bit som fortegn og resten som størrelse. Det gir både +0 og −0. + +**Énerkomplement** inverterer alle bit for å lage den negative verdien. Også dette gir to nullrepresentasjoner. + +**Toerkomplement** er standardrepresentasjonen i moderne heltallsaritmetikk. For (n) bit er området + +`-2^(n-1) ... 2^(n-1)-1`. + +For åtte bit er området −128 til 127. + +## OBSERVE + +Samme rå byte kan tolkes forskjellig: + +- `FF₁₆` = 255 som unsigned 8-bit +- `FF₁₆` = −1 som signed 8-bit toerkomplement + +Ingen av tolkningene ligger «i» bitene alene. + +## EXPLAIN + +Representasjon krever kontekst: bitbredde, signedness og kodingsregel. Debuggere og disassemblere må derfor vite hvilken type de skal vise. + +## Sjekk deg selv + +Hva er området for signed 16-bit toerkomplement? Hvorfor er det én flere negativ verdi enn positive verdier? diff --git a/course/no/09-toerkomplement.md b/course/no/09-toerkomplement.md new file mode 100644 index 0000000..f6ee512 --- /dev/null +++ b/course/no/09-toerkomplement.md @@ -0,0 +1,45 @@ +# Toerkomplement i praksis + +Toerkomplement gjør at samme binære addisjonsmaskinvare kan brukes for positive og negative heltall. + +## PREDICT + +Hvordan kan `11111011₂` representere −5? + +## STEP + +For å finne representasjonen av −5 i åtte bit: + +1. skriv +5: `00000101` +2. inverter bitene: `11111010` +3. legg til 1: `11111011` + +Dermed er `FB₁₆` signed 8-bit −5. + +En rask matematisk tolkning av et mønster med toppbit 1 er å ta den unsigned verdien og trekke fra (2^n): + +`251 - 256 = -5`. + +## Addisjon + +`5 + (-5)`: + +`00000101 + 11111011 = 1 00000000` + +Carry utenfor åtte bit forkastes, og resultatet er null. + +## Negering og minimumsverdien + +Negering gjøres med invertering + 1. Men −128 i signed 8-bit har ingen positiv motpart som passer i samme type; +128 ligger utenfor området. Dette er en viktig edge case. + +## OBSERVE + +Carry og signed overflow er ikke det samme. CPU-er kan ha separate flagg fordi unsigned og signed tolkning stiller forskjellige spørsmål til samme bitresultat. + +## EXPLAIN + +Toerkomplement er best forstått som aritmetikk modulo (2^n), kombinert med en signed tolkning av halvparten av bitmønstrene. + +## Sjekk deg selv + +Representer −1, −42 og −128 som 8-bit hex. Tolk `80₁₆` både unsigned og signed. diff --git a/exercises/no/03-heltall.md b/exercises/no/03-heltall.md new file mode 100644 index 0000000..6413fda --- /dev/null +++ b/exercises/no/03-heltall.md @@ -0,0 +1,9 @@ +# Øvelser: heltallsrepresentasjon + +1. Finn unsigned-området for 10 bit. +2. Tolk `FE₁₆` som unsigned 8-bit og signed 8-bit toerkomplement. +3. Skriv −42 som 8-bit toerkomplement i binær og hex. +4. Hva blir `250 + 20` dersom bare åtte bit beholdes? +5. Forklar forskjellen mellom carry og signed overflow. +6. Hvorfor kan signed 8-bit representere −128, men ikke +128? +7. Hva blir `7F₁₆ + 01₁₆` som signed 8-bit, og hvorfor er resultatet problematisk? diff --git a/solutions/no/03-heltall.md b/solutions/no/03-heltall.md new file mode 100644 index 0000000..1f59fbf --- /dev/null +++ b/solutions/no/03-heltall.md @@ -0,0 +1,9 @@ +# Løsninger: heltallsrepresentasjon + +1. (2^{10}=1024) mønstre: 0–1023. +2. `FE₁₆` er 254 unsigned og −2 signed 8-bit toerkomplement. +3. +42 er `00101010₂`; inverter + 1 gir `11010110₂ = D6₁₆`. +4. 270 modulo 256 = 14. +5. Carry beskriver overflow i unsigned aritmetikk; signed overflow oppstår når det matematiske signed-resultatet ikke passer i signed-området. +6. Toerkomplement har området −128..127; null bruker ett mønster, og den negative halvdelen inkluderer minimumsverdien −128. +7. `7F + 01 = 80`. Bitmønsteret tolkes som −128 signed, mens det matematiske resultatet +128 ikke kan representeres: signed overflow.