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ć?

 191
Author: Joachim Sauer, 2009-11-13

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.

 187
Author: Mark Ransom,
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).

 56
Author: Chris Lutz,
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.

 34
Author: AnT,
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.

 7
Author: Justin Love,
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

 7
Author: Tereus Scott,
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).

 6
Author: Pavel Minaev,
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.

 3
Author: VP.,
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.

 2
Author: atlpeg,
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