[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