C/Przenośność programów: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
m →Porządek bitów a pola bitowe: jeszcze raz to samo |
m - porządek bitów |
||
Linia 17:
<pre>adres | 0 | 1 |
wartość |0x34|0x12|</pre>
=== 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
#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
#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
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
#include <stdio.h>
#include <endian.h>
|