[OT]C CO tim chtel basnik rici?

Josef Štengl ok1ced na nagano.cz
Čtvrtek Leden 1 18:39:02 CET 2015


Ale to je přeci naprosto jasné. To záleží na platformě a kompilátoru, jak je řečeno v normě C uvedeno později :-)

Jedná se o jeden z typických příkladů nevhodně (chybně) napsaného kódu :-D


Předpokládám že 0xFFFFFFFF je v registru, protože pak by by výsledek závislý na preprocesoru.


Platforma (cpu/kompilátor):

a) který nemá signed shift:

1) 0u
2) 0u

tady to je snad jasné.


b) který má signed shift:

1) 0u
2) 0xFFFFFFFF;    -1 nelze celočíselně dělit/násobit, vyjde vždy -1

Příklad pro ARM, který má unsigned (LSR) i signed (ASR) dělení. Assembler je zobrazen jen podstatný řádek.


volatile uint32_t res_u32;
volatile int32_t res_i32;

	val_u32 = 0xFFFF0000u;

	val_i32 = 0xFFFF0000;


	res_u32  = val_u32 >> 8u;    // 0x00FFFF00 – posouvaný člen je unsigned, použije se unsigned posun.
    MOV             R12, R12, LSR #8  // na druhém členu nezáleží, ale měl by se psát pro forumu s u

	res_u32  = val_i32 >> 8u;    // 0xFFFFFF00 – posouvaný člen je signed, použije se signed posun a výsledná hodnota 
přetypována na unsigned (nevejde se, ale hodnota se nemění)
    MOV             R12, R12, ASR #8  // na druhém členu nezáleží

	res_u32  = val_u32 >> 8;     // 0x00FFFF00 – posouvaný člen je unsigned, použije se unsigned posun.
    MOV             R12, R12, LSR #8  // na druhém členu nezáleží, ale měl by se psát pro forumu s u

	res_u32  = val_i32 >> 8;     // 0xFFFFFF00 ....
    MOV             R12, R12, ASR #8

	res_i32  = val_u32 >> 8u;    // 16776960 (0x00FFFF00) – posouvaný člen unsigned uložený v signed proměnné
    MOV             R12, R12, LSR #8

	res_i32  = val_i32 >> 8u;    // -256 (0xFFFFFF00)  ... a tak dále ...
    MOV             R12, R12, ASR #8

	res_i32  = val_u32 >> 8;
    MOV             R12, R12, LSR #8

	res_i32  = val_i32 >> 8;
    MOV             R12, R12, ASR #8


Podobně je to i pro jádro C2000 (takově divné DSP od TI).

Pokud používám bitové posuny pro signed proměnné je dobré si při startu ověřit (zejména používám-li je v nějaké knihově) 
při inicializaci (před použitím), jestli jsou HW podporovány.

ced




Dne 31.12.2014 v 17:43 Stano napsal(a):
> Vecna tema C vs ostatne jazyky
> Tie zatvorky to je vec zvyku, mne sa osobne lepsie orientuje v zatvorkach ako v tone textu. Netvrdim ze to musi vyhovovat
> kazdemu...
> Na C alebo skor gcc mam tazke srdce koli inym "vlastnostiam"
> Len tak schvalne aky vysledok bude podla vas v tychto prikladoch:
>
> uint32_t addr_rem, mask;
> addr_rem = 32;
> mask = 0xFFFFFFFF >> addr_rem;
>
> A aky v pripade:
>
> mask = 0xFFFFFFFF >> 32;
>



Další informace o konferenci Hw-list