OT odcitanie v C
Miroslav Mraz
mraz na seznam.cz
Čtvrtek Duben 24 15:02:01 CEST 2014
Asi by tedy bylo lépe rozepsat
register uint16_t x = l - h;
if ( x < 3 ) result |= 2;
a je pokoj.
Mrazík
On 04/24/2014 01:41 PM, Jan Waclawek wrote:
> Najprv zopakujem dovod: do h sme akoze nacitali hodnotu citaca , ktory
> bol v stave 0xFFFFFFFE, ale h je len uint16_t, takze v nom je 0xFFFE.
> Citac l urobil 4 tiky a je v nom 0x00000002. Snazime sa urobit
> operaciu, ktorou ziskame tych 4, t.j. < 3 musi byt false a < 10 musi
> byt true. Ako prve sa robi to odcitanie, to ma po pretypovani l oba
> operandy uint16_t, co je "menej ako" int (32-bitove, sme sa dohodli,
> t.j. znamienko a 31 bitov), takze sa kvoli "usual conversions" oba
> operandy skonvertuju do int (ich hodnota sa nezmeni) a urobi sa
> odcitanie. Vysledok odcitania je 0xFFFF0004, ale pozor, typ je int,
> t.j. znamienkovy, t.j. sa to interpretuje ako -0xFFFC, co je menej ako
> 3 (ktory ma implicitne tiez typ int, ale je to kladna konstanta), co
> sme nechceli. Mimochodom, vysledok odcitania vo vsetkych styroch
> pripadoch je 0xFFFF0004. Rozdiel je v interpretacii a v
> "postprocesingu": - v pripade (l - h), kedze l je uint32_t, co sa do
> int "nezmesti", h sa konvertuje na uint32_t (a aj tie konstanty 3 a
> 10, ale kedze su male a kladne, tak na tom nezalezi), takze sa
> porovnava celych 0xFFFF0004, a zlyha to na porovnani voci 10 - v
> pripade ((uint16_t)l - h) ide o horepopisanu nechcenu konverziu na
> znamienkovy int - pripad (uint16_t)(l - h) v okamihu odcitania je
> rozdiel ako v prvom pripade uint32_t, ale nasledne je explicitne
> konvertovany na uint16_t co z neho zahodi hornych 16 bitov a ostane
> zelana hodnota 4; ta je pre ucely porovnania implicitne konvertovana
> na int, ale je to kladna hodnota takze na tom nezalezi - pripad
> (uint16_t)((uint16_t)l - h) - v okamihu odcitania je rozdiel ako v
> druhom pripade int, ale explicitna konverzia na uint16_t uplne rovnako
> odreze hornych 16 bitov, takze ako v 3. pripade aj tu ostane zelana
> kladna hodnota 4 wek
Další informace o konferenci Hw-list