• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Znaki niemieszczące się w 8-bitowych bajtach.

0 głosów
380 wizyt
pytanie zadane 11 maja 2018 w C i C++ przez Huberti Gaduła (4,500 p.)

Witam, mam taki fragment w książce: 

Programy muszą czasami obsłużyć zestawy znaków niemieszczące się w pojedynczych, 8-bitowych bajtach. C++ pozwala obsłużyć taką sytuację na kilka sposobów. Przede wszystkim, jeśli podstawowym zbiorem znaków implementacji jest obszerny zestaw, producent kompilatora może zdefiniować typ char jako 16-bitowy lub nawet dłuższy.

Moje pytanie brzmi: czy w sytuacji, gdy producent kompilatora zdefiniuje typ char na 16-bitowy, to jeden bajt będzie składał się z 16 bitów?

Definicja bajta w C++:

 W C++ bajt składa się z tylu bitów, aby móc pomieścić podstawowy zestaw znaków używany w danym kompilatorze. 

Wtedy dla 16 bitowego typu short poniższa instrukcja zwróci 1?

#include <iostream>

int main()
{
      std::cout<<sizeof(short)<<std::endl;
      return 0;
}

2 odpowiedzi

+2 głosów
odpowiedź 11 maja 2018 przez mokrowski Mędrzec (159,000 p.)
wybrane 12 maja 2018 przez Huberti
 
Najlepsza

Typ char zawsze miał i będzie miał rozmiar jednego bajta. Nie ma możliwości aby typ char miał 2 bajty lub więcej. Standard gwarantuje że sizeof(char) zwróci zawsze 1

Kompilatory implementujące standard C++11 lub nowsze, definiują natomiast typy:

wchar_t, char16_t, char32_t

wchar_t przechowuje zestaw wystarczający do obsługi znaków narodowych (wide - szeroki) obsługiwany przez platformę systemową. Dla GNU/Linux to 4 bajty w MS Windows 2. char16_t i char32_t przechowują znak na 2 i 4 bajtach.

https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/

komentarz 11 maja 2018 przez Huberti Gaduła (4,500 p.)
Czyli producent kompilatora nie może zmienić wielkości zmiennej typu char, ale może zwiększyć rozmiar bajta. Dobrze rozumiem?
komentarz 11 maja 2018 przez mokrowski Mędrzec (159,000 p.)

Tak. Masz nawet makro które o tym może Cię powiadomić. CHAR_BIT będzie miało wartość nie mniejszą niż 8

Poza tym standard definiuje zobowiązanie:

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

Określa także minimalną wielkość int i short int na 16 bitów.

komentarz 12 maja 2018 przez Huberti Gaduła (4,500 p.)
Dzięki za pomoc. :)
0 głosów
odpowiedź 11 maja 2018 przez monika90 Pasjonat (22,940 p.)
edycja 11 maja 2018 przez monika90

czy w sytuacji, gdy producent kompilatora zdefiniuje typ char na 16-bitowy, to jeden bajt będzie składał się z 16 bitów?

Tak. Jak widzisz w C i C++ bajt może mieć więcej niż 8 bitów.

Wtedy dla 16 bitowego typu short poniższa instrukcja zwróci 1?

Tak. (Oczywiście short nie musi się ograniczać do 16 bitów, może mieć np. 32 i wtedy sizeof zwróci 2.)

Głównym powodem dla którego w jakiejś implementacji C++ bajt ma więcej niż 8 bitów jest to, że jakiś procesor nie potrafi zaadresować kawałka mniejszego niż 16 lub 32-bitowe słowo. To częste w procesorach DSP.

Podobne pytania

0 głosów
2 odpowiedzi 1,429 wizyt
pytanie zadane 19 kwietnia 2020 w Systemy operacyjne, programy przez tonn204 Mądrala (7,470 p.)
0 głosów
3 odpowiedzi 10,558 wizyt
pytanie zadane 13 marca 2018 w Offtop przez Hiskiel Pasjonat (22,830 p.)
+1 głos
1 odpowiedź 1,059 wizyt
pytanie zadane 17 listopada 2020 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

93,771 zapytań

142,731 odpowiedzi

323,383 komentarzy

63,371 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...