Kronljusströmställaren 0, 1, 2, 3 William Sandqvist william@kth.se
William Sandqvist william@kth.se Styr med binärkod William Sandqvist william@kth.se
William Sandqvist william@kth.se Dec Bin Hex Dec Bin Hex 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 10 1010 A 11 1011 B 12 1100 C 13 1101 D 14 1110 E 15 1111 F Dec Bin, successiva divisioner med 2 William Sandqvist william@kth.se
William Sandqvist william@kth.se Komplementräkning Subtraktion med en additionsmaskin = komplementräkning 63 - 17 = 46 Talet -17 slås in som med röda siffror 17 och blir då 82. När - tangenten trycks in adderas 1. Resultatet blir: 63+82+1 = 146. Om bara två siffror visas: 46 William Sandqvist william@kth.se
William Sandqvist william@kth.se 2-komplement Binärtalet 3, 0011, blir negativt -3 genom att man inverterar alla bitar och lägger till ett, 1101. William Sandqvist william@kth.se
William Sandqvist william@kth.se Registeraritmetik Datorregister är ”ringar” Ett fyra bitars register rymmer 24 = 16 tal. Antingen 8 positiva (+0…+7) och 8 negativa (-1…-8) tal ”med tecken”, eller 16 (0…F) ”teckenlösa” tal. Om registret är fullt gör ”+1” att det ”slår runt”. William Sandqvist william@kth.se
William Sandqvist william@kth.se Registerlängd 4 bitar kallas Nibble. Registret rymmer 24 = 16 tal. 0…15, -8…+7 8 bitar kallas Byte. Registret rymmer 28 = 256 tal. 0…255, -128…+127 16 bitar kallas Word. 216 = 65536 tal. 0…65535, -32768…+32767 Vanliga registerstorlekar är idag 32 bitar (DoubleWord) och 64 bitar (QuadWord ). William Sandqvist william@kth.se
Exempel registerlängd Ett datorregister som blir fullt slår runt som km-räknaren på en bil. En speciell Carry-flagga kan signalera om detta hänt! William Sandqvist william@kth.se
William Sandqvist william@kth.se Overflow När man räknar med ”tal med tecken” kan summan av två positiva tal felaktigt bli negativ (tex. ”+4” + ”+5” = ”-7”), liksom summan av två negativa tal felaktigt kan bli positiv (tex. ”-6” + ”-7” = ”+3”). Detta kallas för Overflow. 32-bitarsdatorer behöver inte ha hårdvara för att upptäcka Carry eller Overflow – det är där sällsynta händelser. William Sandqvist william@kth.se
William Sandqvist william@kth.se Sign Extension Om ett tal ”med tecken” ska kopieras från ett kort register (tex. 4 bitar) till ett längre register (tex. 8 bitar) gör man Signextension. Är talet positivt fyller man på med inledande 0:or är det negativt med inledande 1:or. William Sandqvist william@kth.se
Windowsprogrammet Kalkylatorn View: Scientific Talsystem: Bin Oct Dec Hex Registerstorlekar: Byte Word Dword Qword Operatorer: + - * / Mod And Or Xor Not … William Sandqvist william@kth.se
William Sandqvist william@kth.se Reella tal Decimalkomma ”,” och Binärpunkt ”.” 10,312510 = 1010.01012 OBS! Ekonomiprogram bör genomgående använda heltal. William Sandqvist william@kth.se
William Sandqvist william@kth.se IEEE – 32 bit float Genom att exponenteten skrivs exess–127 kan flyttal storlekssorteras med vanlig heltalsaritmetik! Dec IEEE-754 William Sandqvist william@kth.se
William Sandqvist william@kth.se ASCII-tabellen Ett tecken lagras i en Byte. Hej! 48 65 6A 21 01001000 01100101 01101010 00100001 http://ascii-table.com/ William Sandqvist william@kth.se
William Sandqvist william@kth.se Unicode Industristandarden Unicode. Syftet är att få en världsgemensam tecken-kodning som fungerar för alla, oav-sett språk eller datorsystem. Unicode använder 21 bitar för ett tecken, totalt 1 114 112 tecken. Ex. anges kodpunkten för α som U+03B1. Ett Unicode-tecken kan lagras i en 32 bitars int. UTF-8 är ASCII kompatibelt A-Z med 1 Byte/tecken. Om det dyker det upp andra tecken går det åt fler bytes/tecken. William Sandqvist william@kth.se
William Sandqvist william@kth.se C’s Datatyper Heltalsvariabler: char, short int, int, long signed eller unsigned Flyttalsvariabler: float, double William Sandqvist william@kth.se
William Sandqvist william@kth.se Hur många Byte är en int? det får man veta genom att köra ett testprogram på sin dator: #include <stdio.h> int main(void) { printf("typ\t\tbytes\n"); printf("signed char \t%d\n", sizeof(char)); printf("unsigned char \t%d\n", sizeof(unsigned char)); printf("signed int \t%d\n", sizeof(int)); printf("unsigned int \t%d\n", sizeof(unsigned int)); printf("long \t\t%d\n", sizeof(long int)); printf("float \t\t%d\n", sizeof(float)); printf("double \t\t%d\n", sizeof(double)); system("PAUSE"); return 0; } William Sandqvist william@kth.se