Je to legrace programovat DSP, už jen proto, že velikost char je 16 bitů, to rozbije spoustu existujícího kódu, nikdo s tím nepočítá, i když to standard C povoluje.
K úplné dokonalosti to dotáhly DSP řady 56F8300, char je tam taky 16 bitů, ale návrháři DSP si řekli, že je to přece škoda, když se často pracuje se stringy, nevyužít celých 16 bitů, takže existuje speciální "packed" adresovací mód, kdy se do jednoho 16-bitového charu ukládají dva 8-bitové znaky. Existuje tedy něco jako standardní pointer (na 16-bitový char) a byte pointer na polovinu 16-bitového charu. Konverze mezi standardním pointerem a byte pointerem znamená vynásobit hodnotu standardního pointeru 2x. void* je byte pointer, takže při volání memset/memcpy je opravdu nutné dávat si pozor, co se tam předává a obvykle to znamená vynásobit hodnotu pointeru 2x.
Jojo, prave zde na tyhle procesory bych nahnal vsechny ty 'patlaly' kodu (co znaji jenom little endian i386 a pouzivaji takove to oblibene 'pretypovani' (byte *)&int), at si na vlastni kuzi vyzkousi, ze norma ANSI C opravdu rika jenom to ze:
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
Na tomto jsme se poprve 'vysekal' na vetsim bratricku DSP320C32 na diplomce, kde sizeof() vseho je sice 1, ale to 1 je 32bitu !!!!
Takze pokud si do charu ulozite 16M, tak to z nej zase prectete :-) A little/big endianes tak nejak ztraci smysl ....
sizeof(type)
Returns size in bytes of the object representation of type.
IMHO stačí psát všude *sizeof(char)
. CHAR_BITS jsou bits, ne bytes.
Pokud by ten kompilátor měl sizeof(char) == 1
, ale char zabíral přesto několik bytes, tak to neodpovídá specifikaci a pak těžko na cokoliv spoléhat. Předpokládám, že ale i byte je pak definovaný jako 32 bitů (například).
To ctes z normy ANSI C nebo je to neco novejsiho (C89/C99)?
sizeof gives the size in units of chars. These "C bytes" need not be 8-bit bytes (though commonly they are); the number of bits is given by the CHAR_BIT macro in the limits.h header.
https://www.thecodingforums.com/threads/implementations-with-char_bit-32.440062/#post-2435265
To bylo z cppreference: http://en.cppreference.com/w/cpp/language/sizeof
Na druhé straně, 6.5.3.4 z C standardu (doufám! - http://c0x.coding-guidelines.com/6.5.3.4.html) říká, že sizeof(char) == 1.
Ono se s tim opravdu u TMS320x bojovalo (+druha odpoved Williama Forbese, ktera ale resi jen polovinu problemu):
https://www.misra.org.uk/forum/viewtopic.php?f=71&t=973&sid=c0d16f6804491874a3064a0fdb4b06b5
(na druhou stranu, ten kod stejne nebyl prenositelny kvuli uplne jinym vecem, tak se to nejak ohlo :/, urcite tam CHAR_BIT nefigurovalo)