Architektura Komputerów/Wykład 2: Dane

Plan wykładu



• Typy danych
• Binarne reprezentacje danych
• Dane w pamięci komputera
• Wektorowe typy danych


Dane, na których operuje komputer




Komputer musi być zaprojektowany tak, aby był zdolny do przetwarzania danych zgodnie z potrzebami użytkownika. Współczesne komputery są używane do przetwarzania danych różnych typów – liczbowych, logicznych, tekstowych, a także obrazów i dźwięków.


Binarna reprezentacja danych



Współczesne komputery działają w systemie binarnym. Wszystkie dane, na których operuje komputer, są zapisane w postaci ciągów cyfr binarnych – bitów (BInary Digit), interpretowanych najczęściej jako liczby binarne.


Wszelkie dane o charakterze nieliczbowym muszą być zapisane (zakodowane) w postaci liczb lub grup liczb.



Dane alfanumeryczne




  • Każdy znak pisarski jest reprezentowany przez liczbę, stanowiącą jego numer w tablicy kodowej 
  • Najczęściej używane kody:
    • ASCII - 128 pozycji, w tym małe i wielkie litery alfabetu łacińskiego
    • rozszerzone kody 256-pozycyjne na bazie ASCII
      • pierwsze 128 pozycji jak w ASCII. następne 128 pozycji zawiera znaki narodowe lub inne symbole
      • problem: różne kody dla różnych części świata
    • kody rodziny EBCDIC (używane głównie przez IBM)
    • UNICODE
      • pierwotnie 216, obecnie do 232 możliwych pozycji
      • reprezentacja wszystkich znaków używanych na świecie

Dane alfanumeryczne – tekstowe mają postać znaków pisarskich – liter, cyfr, znaków przestankowych i innych symboli . W komputerze są one reprezentowane przez liczby, określające pozycję danego symbolu w tablicy kodowej. We współczesnych komputerach używa się kilku standardów kodowania znaków pisarskich.


Kod ASCII został opracowany w pierwszej połowie XX wieku dla urządzeń dalekopisowych. Zawiera on cyfry, znaki przestankowe, podstawowe symbole matematyczne oraz małe i wielkie litery alfabetu łacińskiego, mieszczące się na 128 pozycjach kodowych.


Kody rodziny EBCDIC są używane w systemach firmy IBM. Bazują one na binarnym kodowaniu liczb dziesiętnych reprezentujących pozycje kodowe znaków.


Kod UNICODE jest uniwersalnym kodem znakowym, umożliwiającym reprezentację wszystkich znaków pisarskich zapisu fonetycznego (głoskowego) używanych na całym świecie. Liczba pozycji kodowych jest praktycznie nieograniczona, obecnie jest zdefiniowanych kilkadziesiąt tysięcy znaków



Kod ASCII



  • Opracowany dla urządzeń dalekopisowych, później przyjęty dla komputerów
  • 128 pozycji, w tym 95 znaków widocznych i 33 niewidoczne 
  • znaki niewidoczne:
    • spacja (kod 32)
    • odstępy i inne kody formatujące
    • kody sterujące transmisją i urządzeniami
  • znaki widoczne:
    • cyfry
    • wielkie i małe litery alfabetu łacińskiego
    • znaki interpunkcyjne
    • podstawowe symbole matematyczne


Co programista powinien wiedzieć o ASCII



  • kody sterujące zajmują pozycje od 0 do 31, w tym
    • CR - powrót na początek wiersza - 13
    • LF - przejście do następnego wiersza - 10
    • inne ważne: HT, FF, BSP, BEL 
  • spacja - kod 32
  • cyfry 0..9 - kody od 48 do 57 (0x30..0x39)
  • litery w kolejności alfabetycznej
    • wielkie - 65..90 (0x41..0x5a) 
    • małe - 97..122 (0x61..0x7a)
    • odstęp pomiędzy małą i wielką literą wynosi 32 (0x20)
  • pozostałe znaki widoczne zajmują pozycje pomiędzy 32 i 127
  • 127 - kod specjalny (kasowanie znaku)

Symbole ASCII o kodach 0..31 nie są znakami pisarskimi, lecz kodami formatującymi oraz kodami sterującymi wymianą informacji. Wśród nich znajdują się m.in. kody: CR – przejście na początek wiersza, LF – przejście do następnego wiersza, FF – rozpoczęcie nowej strony, HT – tabulacja pozioma, BSP – cofnięcie o jeden znak, BEL – sygnał dźwiękowy, VT – tabulacja pionowa i wiele innych.


Rozszerzone kody na bazie ASCII



  • 256 pozycji kodowych - reprezentacja 8-bitowa
    • pierwsze 128 pozycji identycznych z ASCII
    • kolejne 128 pozycji reprezentuje znaki wybranej grupy alfabetów narodowych lub inne. np.
      • znaki alfabetów słowiańskich
      • znaki alfabetów skandynawskich
      • cyrylica
      • alfabet grecki
  • Wiele tablic kodowych pochodzących z wielu źródeł, m.in.
    • IS08859 - kilkanaście tablic (znaki polskie - IS08859-2)
    • Microsoft - kilkadziesiąt tablic, tzw. "strony kodowe" - CP
    • Własne o lokalnym zasięgu, np. Mazovia. Polgaz

Na bazie kodu ASCII zaprojektowano wiele kodów rozszerzonych, zawierających 256 pozycji kodowych. W kodach tych pierwsze 128 pozycji jest identyczne, jak w kodzie ASCII, a następne 128 pozycji zawiera znaki dodatkowe, np. litery akcentowane, rozszerzony zestaw symboli matematycznych, litery alfabetów narodowych. Istnieje wiele kodów tej rodziny, używanych w różnych częściach świata. W Polsce najpowszechniej używa się kodów ISO8859-2 oraz Microsoft CP1250. Jeszcze kilkanaście lat temu w naszym kraju używano ponad 12 różnych standardów kodowanie polskich znaków.


Reprezentacja dźwięków i obrazów



  • Dźwięk:
    • chwilowa wartość napięcia reprezentującego ciśnienie akustyczne próbkowana z częstotliwością zależną od potrzeb (zwykle od 8 do 48 kHz)
    • wartości próbek zapisywane jako liczby
  • Obraz rastrowy
    • zapisany w postaci prostokątnej macierzy punktów (pikseli)
    • każdemu pikselowi odpowiada jeden kolor
    • kolor reprezentowany w postaci trzech składowych - jasności świateł podstawowych
    • wartości jasności zapisane w postaci liczb


Jednostki informacji



  • bit (Binary digIT) - skrót „b"- najmniejsza jednostka informacji, odpowiada informacji TAK-NIE, 1-0, PRAWDA-FAŁSZ
  • bajt (byte) - skrót „B" - najmniejsza jednostka informacji adresowana przez procesor - obecnie 8 bitów
  • słowo (word) - jednostka informacji, na której operuje komputer
  • 1, 2, 4, 8,16 bajtów
  • słowo procesora - jednostka informacji o długości naturalnej dla danego procesora
    • długość odpowiada długości rejestrów - obecnie 32 lub 64 bity
  • słowo pamięci - jednostka informacji możliwa do przetransmitowania w jednym cyklu transmisji do lub z pamięci
    • obecnie zwykle 64 bity. niekiedy 128
    • większa długość = szybsza transmisja danych


Formaty danych



  • Komputery operują na słowach - ciągach bitów o długościach wyrażonych najczęściej potęgami liczby 2
    • typowe długości stów dla komputerów uniwersalnych - 8, 16, 32, 64, 128 bitów
    • komputery specjalizowane mogą używać innych formatów danych -np. 24 bity
  • Niektóre komputery mogą ponadto operować na pojedynczych bitach i ciągach bitowo dowolnych, niewielkich długościach -tzw. polach bitowych
  • Dane są najczęściej zapisywane w postaci słów o długości odpowiedniej dla danego typu komputera


Zapisy danych logicznych (Boolowskich)



  • Do zapisu danej logicznej wystarcza jeden bit
    • w komputerach obsługujących dane bitowe używa się zapisu jednobitowego
  • W większości komputerów dane logiczne są reprezentowane przez słowa o długości naturalnej dla danego komputera
    • tak samo. jak dane całkowitoliczbowe - np. 32 bity
  • Reprezentacji zależą od środowiska i języka programowania
    • wartość "fałsz" jest zwykle reprezentowana przez słowo o wszystkich bitach równych 0
    • "prawda" może być reprezentowana przez:
      • liczbę całkowitą o wartości 1 (język C - wynik operacji)
      • liczbę całkowitą o dowolnej wartości różnej od zera (język C - argument operacji)
      • słowo o wszystkich bitach równych 1 (np. Visual Basic)

Najprostszy typ danych stanowią dane logiczne. Mogą one przyjmować dwie wartości. Bajtowe adresowanie danych używane w komputerach oraz fakt, że wiele komputerów traktuje jako podstawowy format danych słowo 32-bitowe powodują, że dane logiczne są zwykle zapisywane w postaci bajtów lub słów, pomimo, że do ich zapisu wystarczyłby pojedynczy bit.


Należy zwrócić uwagę na reprezentację wartości PRAWDA w różnych językach programowania. Różne wzorce bitowe używane w różnych językach oraz korzystanie z operatorów (np. negacji) bitowych zamiast logicznych mogą być przyczyną błędów w programach, w których poszczególne moduły są pisane w różnych językach.



Zapis liczb całkowitych nieujemnych



  • Naturalny kod binarny - NKB
{\nu_{NKB}} = \sum_{i-0}^{n-1}{b_{i} \cdot 2^{i}


W dalszej części do opisu różnych reprezentacji danych liczbowych będziemy posługiwali się założeniem, że dane reprezentowane są przez słowo komputera, w którym poszczególne bity zostały ponumerowane od prawej do lewej strony.


W naturalnym kodzie binarnym numer bitu jest równy wykładnikowi jego wagi binarnej.


Zapis BCD polega na oddzielnym zakodowaniu w postaci binarnej (w kodzie NKB) każdej cyfry zapisu dziesiętnego, w postaci czterech bitów (tetrady). Zapis ten był dawniej używany do reprezentacji danych w języku COBOL. Obecnie jest on bardzo rzadko stosowany, głównie w mikrokontrolerach.



Zapisy liczb całkowitych ze znakiem



  • U2 - kod uzupełnieniowy do dwóch
                                    v_{u2} =-b_{n-1} \cdot 2^{n-1} +\sum_{i-0}^{n-2}{b_{i} \cdot 2^{i} }

  • U1 - kod uzupełnieniowy do jedności

                                    v_{u1}=-b_{n-1}\cdot  (2^{n-1} -1)+\sum_{i-0}^{n-2}{b_{i} \cdot 2^{i}}
  • Znak-moduł
                                    v_{Z-M} =-1^{b_{n-1}}\cdot \sum_{i-0}^{n-1}{b_{i} \cdot 2^{i} }
  • zapis spolaryzowany (biased)
    • zwykle przyjmuje się 
      BIAS = 2n-1-1
                                    v_{B} =-BIAS+\sum_{i-0}^{n-1}{b_{i} \cdot 2^{i}}




Ekran przedstawia kilka najważniejszych zapisów liczb ze znakiem.


Zapis U2 jest najczęściej stosowanym zapisem liczb całkowitych. Jest on podobny do NKB, z tą różnicą, że najbardziej znaczący bit ma wagę ujemną. Typ int jest we współczesnych komputerach implementowany jako zapis U2.


Zapis U1 był popularny kilkadziesiąt lat temu. Zapis ten jest podobny do U2, ale wartość bezwzględna najbardziej znaczącego bitu jes tu o jeden mniejsza. Obecnie wyszedł on z użycia.


Zapis znak-moduł wydaje się być najbardziej intuicyjnym – jeden bit jest interpretowany jako znak liczby, pozostałe bity – jako wartość bezwzględna w kodzie NKB. Jest on jednak niewygodny dla jednostek arytmetycznych i współczesne komputery nie obsługują danych całkowitoliczbowych w tym zapisie.


Zapis spolaryzowany umożliwia reprezentację licz ze znakiem jako licz bez znaku, z odpowiednim przesunięciem wartości 0. Liczby ujemne zapisywane są jako bliskie zeru,a zero – jako wartość w połowie zakresu reprezentacji NKB. Zapis powstaje przez dodanie do zapisywanej wartości stałej – podkładu, a następnie zapisanie tak uzyskanej liczby w kodzie NKB. Jako wartość podkładu przyjmuje się zwykle wartość leżącą tuż poniżej połowy zakresu w NKB.



Istotne własności kodów




  • Reprezentacja zera
    • liczba możliwych reprezentacji
      • dwie reprezentacje w kodach U1 i znak-moduł
    • łatwość wykrywania wartości 0
  • Symetryczność zakresu (dla liczb ze znakiem)
  • Reprezentacja znaku liczby
    • łatwość rozróżniania znaku
  • Zmiana znaku liczby
    • U1 - negacja bitowa
    • U2 - negacja i inkrementacja
    • znak-moduł - negacja bitu znaku
  • Łatwość wykonywania operacji arytmetycznych
    • dodawanie i odejmowanie w U2 realizuje się tak samo, jak w NKB
      • inne wykrywanie nadmiaru


Kody całkowitoliczbowe charakteryzują się zestawem własności, które decydują o wygodzie ich stosowania. Istotne własności to m.in.:


Reprezentacja zera – wpływa na łatwość wykrywania wartości 0 przy użyciu prostego układu logicznego.


Reprezentacja znaku – wpływa na łatwość rozróżnienia liczb ujemnych od dodatnich.


Operacja, jaką należy wykonać w celu zmiany znaku liczby – może to być prosta operacja logiczna, prosta lub złożona operacja arytmetyczna.


Łatwość wykonywania operacji arytmetycznych – dodawanie i odejmowanie w U2 jest realizowane tak samo, jak w NKB. Mnożenie i dzielenie w U2 jest niewygodne, za to liczby zapisane w kodzie znak-moduł można mnożyć i dzielić niemal tak samo, jak w NKB.



Własności kodów całkowitoliczbowych - zestawienie




Zapis stałopozycyjny



  • Powstaje przez przesunięcie wag w zapisie całkowitoliczbowym
    • czyli przez pomnożenie wartości zapisu całkowitoliczbowego przez 2-f (f- liczba bitów w części ułamkowej)
  • Używany zwykle w U2, niekiedy w NKB
  • Najczęściej spotykane formaty:
    • jeden lub dwa bity części całkowitej, pozostałe bity słowa należą do części ułamkowej
    • po polowie słowa na część całkowitą i ułamkową
  • Operacje arytmetyczne wykonywane podobnie, jak w zapisie całkowitoliczbowym
    • skalowanie przy mnożeniu i dzieleniu
    • nie wymaga specjalnych instrukcji procesora ani zasobów sprzętowych


Do zapisywania liczb ułamkowych i mieszanych można użyć zapisu stałopozycyjnego. W zapisie tym liczba jest reprezentowany przez słowo binarne, w którym pewne, z góry określone liczby bitów reprezentują część całkowitą i część ułamkową liczby. Odpowiada to interpretacji zapisu całkowitoliczbowego, pomnożonej przez wartość będącą ujemną potęgą liczby 2.


Do zapisu liczb bez znaku używa się jako bazowej postaci NKB, a do zapisu liczb ze znakiem – U2. Komputery zazwyczaj nie obsługują w szczególny sposób zapisów stałopozycyjnych. Podstawowe operacje są wykonywane tak samo, jak na liczbach całkowitych, odmienna jest jedynie interpretacja zapisu, za którą jest odpowiedzialny wyłącznie programista.



Zapis stałopozycyjny - przykłady





Zapis zmiennopozycyjny - podstawy



  • Dziesiętny zapis zmiennopozycyjny - przykłady
    -1.234 • 105    -0.1234 • 106      -12.34 • 104
  • Elementy zapisu
    • znak liczby
    • część znacząca
    • wykładnik
  • Podstawa systemu (10) jest ustalona i jej zapis jest zbędny
  • Postać znormalizowana - postać, w której część całkowita części znaczącej wyraża się pojedynczą cyfrą różną od zera
    • w przykładzie powyżej - postać -1.234 • 105
    • inne postaci są zdenormalizowane (nie znormalizowane)
    • zera nie da się zapisać w postaci znormalizowanej

Zapis zmiennopozycyjny umożliwia zapisywanie liczb całkowitych i ułamkowych o bardzo dużym zakresie dynamiki wartości bezwzględnych. Do wprowadzenie zapisu binarnego posłużymy się najpierw obserwacjami związanymi z dziesiętnym zapisem zmiennopozycyjnym.


Każda liczba może być zapisana na kilka sposobów, różniących się położeniem przecinka oddzielającego część całkowitą od ułamkowej i wartością wykładnika

Zwykle posługujemy się jedną z możliwych postaci jako preferowaną. Postać tę nazywamy znormalizowaną. Postać znormalizowana ma część całkowitą części znaczącej wyrażoną przez pojedynczą cyfrę różną od zera.


Aby zapisać (przechować) liczbę, musimy zapisać jej znak, część znaczącą oraz wykładnik, który jest liczbą całkowitą ze znakiem.


W postaci znormalizowanej nie da się zapisać zera, bo zero nie ma żadnej cyfry znaczącej różnej od 0.



Binarny zapis zmiennopozycyjny - IEEE754




  • Jeżeli jest to możliwe, liczbę zapisuje się w postaci znormalizowanej
    • wyjątki: zero i liczby o wartościach bezwzględnych bliskich zeru
    • jedyną cyfrą binarną różną od zera jest 1
      • każda postać znormalizowana ma część całkowitą równą 1
      • nie ma potrzeby zapisywania części całkowitej w postaci znormalizowanej
  • Elementy zapisu
    • znak liczby- pojedynczy bit - (0 - liczba nieujemna, 1 - liczba niedodatnia)
    • pole wykładnika
      • przy zapisie znormalizowanym - wykładnik w kodzie spolaryzowanym
      • wartości specjalne: 00...00 - postać zdenormalizowana, 11...11 -"nieliczba"
    • pole mantysy - zawiera tylko część ułamkową
      • postać znormalizowana - część całkowita równa 1
      • postać zdenormalizowana - część całkowita równa 0

W przeszłości w różnych rodzinach komputerów używano różnych zapisów zmiennopozycyjnych. Od początku lat 80-tych XX wieku nastąpiła w tej dziedzinie standaryzacja. Obecnie niemal wszystkie komputery posługują się binarnym zapisem zmiennopozycyjnym zgodnym ze standardem IEEE754.


Standard zakłada, że, o ile tylko jest to możliwe, liczby zapisuje się w postaci znormalizowanej. Bazą systemu jest liczba 2 – wykładnik określa potęgę liczby 2.


Ponieważ w systemie binarnym jedyną cyfrą różną od zera jest jedynka, każda liczba w postaci znormalizowanej ma część cakowitą równą 1 – nie ma więc potrzeby zapisywania jej – zapisuje się tylko część ułamkową.


Wykładnik jest liczbą całkowitą ze znakiem. W IEEE754 wykładnik jest zapisywany w kodzie spolaryzowanym, w którym wartość podkładu jest określona wzorcem bitowym 01....11, o liczbie bitów równej szerokości pola wykładnika. Dwie wartości pola wykładnika są zarezerwowane i oznaczają, że zapis nie reprezentuje postaci znormalizowanej.


Pole wykładnika o wzorcu 00...00 oznacza zapis zdenormalizowany. Wartość wykładnika jest w tym przypadku taka sama, jak przy zapisie znormalizowanym z wzorcem wykładnika 00...01, a część całkowita części znaczącej ma wartość 0 (a nie 1 jak w postaci znormalizowanej).


Pole wykładnika o wzorcu 11...11 oznacza nie-liczby – nieskończoności i wartości błędne.



IEEE754 - wartości




Wartość pola wykładnika równa 0 oznacza postać zdenormalizowaną. Jeżeli pole mantysy ma wartość 0 – zapis reprezentuje liczbę 0. W przeciwnym przypadku jest to liczba o bardzo małej wartości bezwzględnej.


Wartość pola wykładnika złożona z bitów o wartości 1 oznacza tzw. nie-liczby. Pole mantysy równe 0 identyfikuje nieskończoność. Wzorzec bitowy, w którym najbardziej znaczący bit jkest równy 0, a wśród pozostałych jest co najmniej jedna jedynka jest zapisem głośnej nie-liczby, czyli wartości, która ni e może być argumentem operacji. Najbardziej znaczący bit mantysy o wertości 1 identyfikuje cichą nie-liczbę. Wynikiem operacji na cichej nie-liczbie jest zawsze cicha nie-liczba.



IEEE754 - typowe formaty




Podstawowym formatem jest format double – 64-bitowy.


Format 32-bitowy jest używany w zastosowaniach, gdzie wymagana precyzja jest niewielka – ma on tylko 24 bity znaczące.


Format 80-bitowy był używany w starszych jednostkach zmiennopozycyjnych procesorów rodziny x86. Obecnie wychodzi on z użycia.


Format 128-bitowy jest formatem „przyszłościowym” dla liczb o dużej precyzji.


W grafice komputerowej używa się niekiedy formatów krótszych, o mniejszej precyzji – 16- i 24-bitowego.



Arytmetyka zmiennopozycyjna




  • Reprezentacja zmiennopozycyjna jest reprezentacją przybliżoną
    • wyniki działań arytmetycznych są również przybliżone
  • Wynik może zależeć od kolejności działań
    • dodawanie i odejmowanie wielu argumentów należy wykonywać w kolejności rosnącej wartości bezwzględnej
    • jeśli |a| jest znacznie mniejsze od |b|. to a + b daje w wyniku b
  • Nie należy używać relacji równości
    • zamiast tego należy używać formuł takich jak abs(a-b) < ɛ
  • Precyzja formatu IEEE single (24 bity) jest mniejsza od precyzji liczb całkowitych w komputerach 32-bitowych
    • możliwa precyzyjna reprezentacja liczb całkowitych w IEEE single jest ograniczona do zakresu wartości bezwzględnych nie rzekraczających 224

Posługując się liczbami zmiennpozycyjnymi należy pamiętać o ich specyficznych własnościach.


Liczby o skończonej reprezentacji dziesiętnej mogą mieć nieskończoną reprezentację binarną (np. 0.1, 0.3). Reprezentacja zmiennopozycyjna jest reprezentacją przybliżoną, a wyniki operacji są w rzeczywistości przybliżeniami. Oznacza to, że w praktyce nie można stosować relacji równości w odniesieniu do liczb zmiennopozycyjnych.


Operacja dodawania liczb różniących się znacznie rzędem wielkości daje w wyniku liczbę równą składnikowi o większej wartości bezwzględnej.



Organizacja pamięci



  • W komputerach uniwersalnych jednostką adresowaną jest bajt
  • Dane wielobajtowe zajmują odpowiednią liczbę komórek pamięci (i adresów)
  • Słowo pamięci ma długość nie mniejszą od słowa procesora
    • Zwykle 64 lub 128 bitów
    • Dawniej bywało odwrotnie

Podstawowa adresowalna komórka pamięci ma rozmiar jednego bajtu. Dane o rozmiarach przekraczających jeden bajt są przechowywane w kilku kolejnych komórkach, pod kilkoma kolejnymi adresami.


Fizyczna organizacja pamięci współczesnych komputerów jest nieco odmienna od organizacji logicznej. Bajty są pogrupowane w słowa pamięci, których długość jest najczęściej dwukrotnie większa od długości słów danych przetwarzanych przez procesor. Taka konstrukcja pamięci umożliwia zwiększenie jej wydajności poprzez transmitowanie większej porcji danych podczas pojedynczego dostępu.


Współczesne procesory 64-bitowe współpracują z pamięcią o szerokości 128 bitów.


Pierwsze mikroprocesory 16- i 32-bitowe, produkowane w latach 70-tych i 80-tych XX wieku były często przystosowane do współpracy z pamięcią o szerokości 8 lub 16 bitów. W tamtym okresie wydajność procesorów była porównywalna z wydajnością pamięci, a pamięć o mniejszej szerokości słowa była tańsza w implementacji.



Konwencje adresowania danych wielobajtowych



  • Little Endian - najmniej znaczący bajt pod najmniejszym adresem
  • Big Endian - najbardziej znaczący bajt pod najmniejszym adresem

Istnieją dwa sposoby zapisu danej wielobajtowej w pamięci, zwane konwencjami adresowania danych. Nazwy konwencji pochodzą z powieści „Podróże Guliwera”, w której odnosiły się one do dwóch społeczności, różniących się zasadami jedzenia gotowanych jaj.


Little-Endian i Big-Endian




Little-Endian



  • Numeracja bajtów zgodna z wagami bitów
  • Naturalna dla komputera
  • Niezbyt naturalna dla człowieka
  • Rzutowanie typów związane ze zmianą długości zachowuje wartość adresu danej

W konwencji Little-Endian adres bajtu odzwierciedla wagę bajtu w liczbie. Jest to konwencja naturalna dla komputera, chociaż dla człowieka na pierwszy rzut oka wydaje się dziwna – jesteśmy przyzwyczajeni do zapisywania liczb począwszy od najbardziej znaczących cyfr.


Istotną cechą tej konwencji jest to, że jeżeli zapiszemy w pamięci daną całkowitoliczbową w długim formacie (np. 64 bity), to przy dostępach do jej mniej znaczącej części o mniejszej długości (np. jednego, dwóch lub czterech bajtów) adres danej będzie w każdym przypadku ten sam. Jest to wygodne przy częstym rzutowaniu typów całkowitoliczbowych, ca ma miejsce w programach pisanych w języku C.



Big Endian



  • Kolejność bajtów naturalna dla człowieka
  • Rzutowanie typów związane ze zmianą długości zmienia wartość adresu
  • Możliwe szybkie porównywanie łańcuchów znakowych

Zapis Big-Endian, naturalny dla człowieka, jest zwykle mniej wygodny dla komputera. Dostęp do danej całkowitoliczbowej w pamięci wymaga zmiany wartości adresu w zależności od długości danej. Jeżeli liczba 32-bitowa zostanie zapisana pod adresem A, to jej wartość w postaci jednobajtowej ma adres A+3.


Istotną zaletą konwencji Big-Endian jest możliwość szybkiego porównywania łańcuchów tekstowych przy użyciu instrukcji operujących na liczbach całkowitych o długości 32 lub 64 bitów. Wektor znaków (bajtów) interpretowany jako liczba ma w najbardziej znaczącym bajcie pierwszy bajt łańcucha. Zamiast więc prowadzić operację porównywania łańcuchów znak po znaku, można ją wykonać posługując się grupami znaków o długości słowa procesora.



Wyrównanie danych



  • Słowo pamięci jest długie
    • we współczesnych komputerach często 2 lub 4 razy dłuższe od słowa procesora
  • Dostęp do danej wielobajtowej mieszczącej się w jednym słowie pamięci jest szybszy niż w przypadku, gdy dana zajmuje fragmenty dwóch słów
    • Dostęp do danej na granicy słów wymaga dwóch przesłań
  • Nowe architektury wymuszają umieszczenie danej w jednym słowie pamięci

Dane powinny być umieszczone w pamięci w taki sposób, aby dostęp do danej, której rozmiar nie przekracza długości słowa pamięci następował w pojedynczym cyklu dostępu do pamięci.


W nowszych architekturach komputerów rozmieszczenie danych gwarantujące dostęp w jednym cyklu transmisji jest obligatoryjne – próba dostępu do danej położonej inaczej generuje błąd.



Wyrównanie naturalne




  • Każda dana powinna być położona pod adresem podzielnym przez jej długość
    • daje to gwarancję najszybszego dostępu
  • Wymuszone w nowszych architekturach
  • Podnosi wydajność w architekturach, w których nie jest wymuszone
    • Obecnie wymuszone przez kompilatory nawet jeśli sprzęt nie narzuca konieczności wyrównania
  • Struktury muszą być wyrównane zgodnie z wyrównaniem najdłuższego typu danych

Dostęp w jednym cyklu przesłania można zagwarantować, umieszczając każdą daną skalarną pod adresem podzielnym przez jej długość. Dane 32-bitowe powinny być położone pod adresami podzielnymi przez 4, a 16-bitowe – pod adresami parzystymi. Takie umieszczenie danych w pamięci nazywa się wyrównaniem naturalnym.


Nawet jeśli model programowy procesora nie narzuca takiego wymagania, wyrównanie naturalne jest zwykle wymuszane przez kompilatory (np. w x86).


Dane strukturalne muszą być wyrównane w taki sposób, aby każde pole struktury było wyrównane naturalnie. Oznacza to, że początek struktury powinien być wyrównany zgodnie z wymaganiami najdłuższego typu danych obsługiwanego przez procesor. Należy zauważyć, że wyrównanie wpływa na rozmiar struktury, zwracany przez operator sizeof – rozmiar jest „zaokrąglany w górę” do granicy wyrównania struktur.


Dane wektorowe




  • Współczesne procesory mogą operować na długich słowach danych
  • Dźwięki i obrazy są zapisane przy użyciu liczb o małej precyzji
  • Algorytmy przetwarzania dźwięków i obrazów wykonują takie same operacje na wszystkich próbkach
  • Wprowadzenie wektorowego formatu danych - wielu krótkich danych zapisanych w pojedynczym słowie - umożliwia lepsze wykorzystanie możliwości procesora


Formaty danych wektorowych - SSE2



  • SSE2 jest jednostką wektorową procesorów x86
  • Słowo danych - 128 bitów
  • Formaty:
    • 16 danych stałopozycyjnych 8-bitowych
    • 8 danych stało pozycyjnych 16-bitowych
    • 4 dane stało pozycyjne 32-bitowe
    • 2 dane stało pozycyjne 64-bitowe
    • 4 dane zmiennopozycyjne 32-bitowe IEEE single
    • 2 dane zmiennopozycyjne 64-bitowe IEEE double