C/Przenośność programów: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Mina86 (dyskusja | edycje)
Kj (dyskusja | edycje)
m - porządek bitów
Linia 17:
<pre>adres | 0 | 1 |
wartość |0x34|0x12|</pre>
 
=== Porządek bitów ===
Tego typu odwracanie nie dotyczy samych bajtów w słowie. Tej samej operacji podlegają pojedyncze bity w bajcie. Zatem, jeśli mamy liczbę jednobajtową, która w zapisie binarnym wygląda tak:
01101010
W architekturze o porządku little-endian będzie wyglądała tak:
01010110
natomiast architektury o porządku big-endian zapiszą ją w tej samej postaci.
 
=== Konwersja z jednego porządku do innego ===
Czasami zdarza się, że programy muszą być przystosowane do przetwarzania danych w określonym porządku, np. big-endian (porządek ten jest obowiązującym w komunikacji sieciowej). W takim przypadku pisząc program, który działa na architekturze o porządku little-endian musimy zadbać o to, aby dane wysyłane były we właściwej kolejności bitów i bajtów. Aby stwierdzić, jaki porządek bitów posiada nasza architektura dołączamy plik endian.h:
#include <endian.h>
Zdefiniowane jest tam makro __BYTE_ORDER. Dzięki niemu możemy dowiedzieć się, jaki porządek bajtów jest stosowany na naszym komputerze. Oto program, sprawdzający kolejnośćtenże bitówporządek:
#include <endian.h>
#include <stdio.h>
Linia 51 ⟶ 44:
Wróćmy do tematu konwersji. Do konwertowania zmiennych pomiędzy różnymi porządkami bitów używa się makr htons(16-bitowe zmienne)/htonl(32-bitowe zmienne) oraz ntohl i ntohs. Makro hton przetwarza lokalny porządek bitów na big-endian, a ntoh z big-endian na lokalny.
 
=== Porządek bitówbajtów a pola bitowe ===
Z rozdziału [[C/Typy złożone|typy złożone]] dowiedziałeś się czym są i jak działają pola bitowe, a w rozdziale [[C/Zaawansowane operacje matematyczne|zaawansowane operacje matematyczne]] zaznajomiłeś się ze sposobem przechowywania liczb zmiennoprzecinkowych w pamięci komputera. Przeanalizujemy je teraz pod kątem kolejności bitów. Najmniejszym typem, przechowującym liczby rzeczywiste jest typ '''float'''. Jest on zbudowany tak<ref>Według normy IEEE 754.</ref>:
S| EXP | MAN
Linia 78 ⟶ 71:
return 0;
}
Powyższy przykład może wydawać się całkowicie poprawny, lecz na architekturach o porządku little-endian będzie on generował niestety niepoprawne wyniki. Dlaczego? Otóż odwrócenie kolejności bitówbajtów oznacza, że bit znaku nie znajdzie się na pierwszym miejscu, lecz na ostatnim. Dlatego kolejność bitów typu będzie dokładnie odwrócona. Dlatego też musimy przestawić kolejność pól bitowych.
#include <stdio.h>
#include <endian.h>