uint8 T vs unsigned char
Jaka jest zaleta używania uint8_t
nad unsigned char
W C?
Wiem, że na prawie każdym systemie uint8_t
jest tylko typedef dla unsigned char
,
więc po co go używać?
8 answers
Dokumentuje Twój zamiar-będziesz przechowywać małe liczby, a nie postać.
Również wygląda ładniej, jeśli używasz innych typów, takich jak uint16_t
lub int32_t
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-19 12:43:37
Aby być pedantycznym, niektóre systemy mogą nie mieć typu 8-bitowego. Według Wikipedii :
Implementacja jest wymagana do zdefiniowania typów całkowitych o dokładnej szerokości dla N = 8, 16, 32 lub 64 wtedy i tylko wtedy, gdy ma jakikolwiek typ, który spełnia wymagania. Nie jest wymagane definiowanie ich dla żadnego innego N, nawet jeśli obsługuje odpowiednie typy.
Więc uint8_t
nie ma gwarancji istnienia, chociaż będzie dla wszystkich platform, gdzie 8 bitów = 1 bajt. Niektóre osadzone platformy mogą być różne, ale to staje się bardzo rzadkie. Niektóre systemy mogą definiować typy char
na 16 bitów, w takim przypadku prawdopodobnie nie będzie żadnego typu 8-bitowego.
Poza tym (drobnym) problemem, odpowiedź @ Mark Ransom jest moim zdaniem najlepsza. Użyj tego, który najlepiej pokazuje, do czego używasz danych.
Również zakładam, że chodziło Ci o uint8_t
(standardowy typedef z C99 podany w nagłówku stdint.h
) zamiast uint_8
(nie będący częścią żadnego standard).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:26
Chodzi o to, aby napisać niezależny od implementacji kod. unsigned char
nie ma gwarancji, że będzie to typ 8-bitowy. uint8_t
jest.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-24 17:00:50
Jak powiedziałeś, "prawie każdy system".
char
jest prawdopodobnie jedną z mniej prawdopodobnych zmian, ale gdy zaczniesz używać uint16_t
i przyjaciół, używanie uint8_t
lepiej się łączy, a nawet może być częścią standardu kodowania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-10 23:08:11
Z mojego doświadczenia wynika, że są dwa miejsca, w których chcemy użyć uint8_t, aby oznaczać 8 bitów (i uint16_t, itd.) i gdzie możemy mieć pola mniejsze niż 8 bitów. Oba miejsca są miejscem, w którym liczy się przestrzeń i często musimy spojrzeć na surowy zrzut danych podczas debugowania i musimy być w stanie szybko określić, co reprezentuje.
Pierwsza z nich znajduje się w protokołach RF, szczególnie w systemach wąskopasmowych. W tym środowisku może być konieczne spakowanie jak największej ilości informacji w jedną wiadomość. Na drugi to pamięć flash, gdzie możemy mieć bardzo ograniczoną przestrzeń (np. w systemach wbudowanych). W obu przypadkach możemy użyć spakowanej struktury danych, w której kompilator zadba o pakowanie i rozpakowywanie za nas:#pragma pack(1)
typedef struct {
uint8_t flag1:1;
uint8_t flag2:1;
padding1 reserved:6; /* not necessary but makes this struct more readable */
uint32_t sequence_no;
uint8_t data[8];
uint32_t crc32;
} s_mypacket __attribute__((packed));
#pragma pack()
To, której metody użyjesz, zależy od Twojego kompilatora. Może być również konieczne wsparcie kilku różnych kompilatorów z tymi samymi plikami nagłówkowymi. Dzieje się tak w systemach wbudowanych, gdzie urządzenia i serwery mogą być zupełnie inne - na przykład możesz mieć urządzenie ARM który komunikuje się z serwerem Linux x86.
Istnieje kilka zastrzeżeń z użyciem spakowanych struktur. Najważniejsze jest to, że musisz unikać dereferowania adresu członka. W systemach z dopasowanymi słowami mutibyte może to spowodować nieprawidłowy wyjątek - i zrzut rdzeniowy.
Niektórzy ludzie będą również martwić się o wydajność i twierdzą, że korzystanie z tych spakowanych struktur spowolni twój system. To prawda, że za kulisami kompilator dodaje kod, aby uzyskać dostęp do niepodpisane elementy danych. Możesz to zobaczyć, patrząc na kod złożenia w swoim IDE.
Ale ponieważ spakowane struktury są najbardziej przydatne do komunikacji i przechowywania danych, dane mogą być wyodrębnione do niepakowanej reprezentacji podczas pracy z nią w pamięci. Normalnie i tak nie musimy pracować z całym pakietem danych w pamięci.
Oto kilka istotnych dyskusji:
Pragma pack (1) nor __attribute__ ((aligned (1))) works
Na GCC ' s __atrybut__((packed)) / # pragma pack unsafe?
Http://solidsmoke.blogspot.ca/2010/07/woes-of-structure-packing-pragma-pack.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:40
Niewiele. Z punktu widzenia przenośności, char
nie może być mniejsza niż 8 bitów, a nic nie może być mniejsze niż char
, więc jeśli dana implementacja C ma niepodpisany 8-bitowy Typ integer, to będzie to char
. Alternatywnie, może nie mieć w ogóle, w którym momencie wszelkie typedef
sztuczki są sporne.
Może być użyty do lepszego udokumentowania kodu w tym sensie, że jest jasne, że potrzebujesz 8-bitowych bajtów i nic więcej. Ale w praktyce jest to rozsądne oczekiwanie praktycznie gdziekolwiek już (są Platformy DSP, na których to nie jest prawda, ale szanse na to, że Twój kod tam działa są niewielkie, a równie dobrze możesz błąd usunąć używając statycznego assert u góry programu na takiej platformie).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-12 22:42:51
Jest to bardzo ważne na przykład podczas pisania analizatora sieci. nagłówki pakietów są definiowane przez specyfikację protokołu, a nie przez sposób działania kompilatora C danej platformy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-01 18:49:02
Na prawie każdym systemie, który spotkałem uint8_t = = unsigned char, ale nie jest to gwarantowane przez standard C. Jeśli próbujesz napisać kod przenośny i ma to znaczenie, jaki jest rozmiar pamięci, użyj uint8_t. w przeciwnym razie użyj unsigned char.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-29 16:42:51