[c++] standard: typ char a sizeof

0

Cos mi sie wlasnie przypomnialo..

Kiedys przeczytalem gdzies baardzo ciekawa dyskusje na temat wielkosci standardowych typow danych. Powszechnie przyjelo sie ze char=1bajt, int=2lub4, long=4b itd. Ale, podobno standard C/C++ wcale nie definiuje tego, nigdzie nie ma zadnego zalozenia ze takie wlasnie rozmiary sa 'wymagane'. Podobno wszystko zalezy do sposobu adresowania pamieci na danej maszynie..

Wnioski jakie zapamietalem z tej dyskusji byly mniejwiecej takie, ze z punktu widzenia standardu jezyka:

  • char to nie jest jeden bajt. char to jest najmniejszy adresowalna bezposrednio komorka/blok pamieci. zwykle to 1 bajt, ale na niektorych maszynach moze to byc 16 lub wiecej bitow
  • sizeof(char) zawsze zwraca 1, nawet jesli zachodzi wyzej opisane
  • sizeof(X) zwraca rozmiar typow danych w kontekscie wielokrotnosci char'a. sizeof(X)==4 nie oznacza 4B tylko 4*char, patrz wyzej

czy ktos moze mial kiedys do czynienia z tekim przypadkiem? tzn. ze char byl defacto wielobajtowy? ciekawi mnie rowniez przypadek odwrotny - przeciez na mocy takich zalozen rownie dobrze CHAR w procku jakiegos zegarka na reke moglby miec tylko 4bity (mapowane nie na zestaw ASCII tylko np. na 0123456789:-(/)# )? ktos moze kiedys sprawdzal jak to dokladnie jest okreslone? :)

0

Mogę Ci wysłać standard jak chcesz. Sam nie sprawdzałem.

0

Podobno wszystko zalezy do sposobu adresowania pamieci na danej maszynie..

Z tego co mi wiadomo, to tak właśnie wygląda. Na niektórych platformach DSP, char ma 32 bity.

0

Pierwszy mikroprocesor intela 4004 był w ogóle 1-bitowy.
CDC Cyber 70 http://en.wikipedia.org/wiki/CDC_Cyber na którym pracowałem miał char 6-cio bitowy.

Jak widać przestrzeni dziejów char miał różne rozmiary.

Q: A co to jest "char" ?
A: Znak
Q: A ile znak zajmuje pamięci?
A: Tyle ile potrzeba aby efektywnie pełnił swoją funkcję. ASCII-1 bajt, UNICODE 2-bajty, ......

Jedyny wniosek: char to znak [???]

W mikroprocesorach przemysłowych (zwykle 8-mio bitowych) mapowamie bitów "char-a" na wyświetlacz (1,2,3,...) odbywa się sprzętowo (bez użycia fontów które służą do zobrazowania sekwencji bitów w znaku).

0

0x666 - oo.. wlasnie, dzieki za spostrzezenie

hektor - ok - wiem o tym. ale czy na ow 4004 albo CDC Cyber 70 sa kompilatory C czy tylko assemblery? co do unicode - to jest juz standard kodowania znakow w pamieci, zwaz ze przeciez mamy jeszcze kodowania wielobajtowe i to wyraznie przeczy ze CHAR nalezy traktowac jako ZNAK (C++ wersja unicode uzywa wchar_t ktorego sizeof zwykle = 2, chociaz na owych DSP o ktorych wspomnial 0x666 - pewnie by bylo =1

0

Jeśli chodzi o 4004 to nie wiem. Widziałem dokumentację dużego bloku w elektrowni sterowanego za pomocą klastrów 4004. Jak znam życie to pewno jakiś tam dinozaur mół coś dłubać przy kompilatorze na tą maszynę.

w ogóle to te dzisiejsze implementacje C na mikrokontrolerach (8-mio bitowych) to bardziej trik marketingowy niż C (uwaga nie dotyczy procesorów 16 i 32 bitowych).

Na CDC pracowałem na kompilatorze Fortran 1200. Na tej maszynie były zaimplementowane też inne języki. Jak dobrze pamiętam to na PW było paru ludzieńków którzy implementowali "C", ale już w ostatnich latach życia maszyny (początek 80' ).
To co napisałeś nie przeczy temu że char to znak. Unicode pojawiło się jak komputery zaczęły używać nacje których alfabet nijak nie mieścił się w 8-miu bitach.
Oczywiście można oderwać się od znaczenia tej nazwy, ale wtedy chyba dobrym rozwiązaniem jest przedefiniowanie char na Int8, BYTE,....
Jak wiem to standard nie definiuje ile bajtów ma mieć char, bo to należy do implementacji języka a nie języka.

0

A: Tyle ile potrzeba aby efektywnie pełnił swoją funkcję. ASCII-1 bajt, UNICODE 2-bajty, ......

Co do UNICODE, to efektywna wersja byłaby 4-bajtowa (UTF-32). W prawdzie większość kodów zmieści się w dwóch bajtach, to zawsze istnieje możliwość wystąpienia znaków 4 bajtowych. UTF-16 to kompromis pomiędzy efektywnością pamięciową a obliczeniową.

1 użytkowników online, w tym zalogowanych: 0, gości: 1