OT odcitanie v C
Josef Štengl
ok1ced na nagano.cz
Čtvrtek Duben 24 13:54:53 CEST 2014
Pokud ten, kdo to bude muset číst je v blízkosti autora, tak výsledek by byl … úderný (minimálně jadrný :-)
Zkusím to jen tak ze srandy;
pro int = 32bit (a arimetika dvojkového doplňku :-)
Jak tak na to koukám, pro int = 16 bit by byl výsledek jiný, vlastně jeden a ten samý výraz, takže by se vždy porovnávalo
se 4u;
Snad se můj organický statický checker spletl jen málo :-)
rozbor je níže
ced
Dne 24.4.2014 10:14, Jan Waclawek napsal(a):
> Aky je vysledok?
>
> #include <stdint.h>
>
> volatile uint32_t l;
> volatile uint16_t h;
> volatile uint8_t result;
>
> int main(void) {
>
> l = 0x00000002;
> h = 0xFFFE;
>
> result = 0;
>
> if (l - h < 3) result |= 1;
usigned - unsigned < unsigned => bez 4 odečíst 0x10000 (0xffff0004u)
> if ( ((uint16_t)l - h) < 3 ) result |= 2;
int - int => bez 4 odečteno 10000 (-65532)
> if ( (uint16_t)(l - h) < 3 ) result |= 4;
(unsigned short)int - int => 0xffff0004 & 0x0000FFFF -> 4
> if ( (uint16_t)((uint16_t)l - h) < 3 ) result |= 8;
To samé jako ↑, +4
zbytek je jen o porovnání, není zajímavý.
>
> if (l - h < 10) result |= 16;
> if ( ((uint16_t)l - h) < 10 ) result |= 32;
> if ( (uint16_t)(l - h) < 10 ) result |= 64;
> if ( (uint16_t)((uint16_t)l - h) < 10 ) result |= 128;
>
>
> while(1) {
> };
> }
>
>
> Aplikacia: mam 32-bitovy volne beziaci casovac (l), a potrebujem odmerat
> nejaky kratky cas, menej ako 65535 tikov (do h si odlozim hodnotu na
> zaciatku odmeriavania).
>
> wek
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
Další informace o konferenci Hw-list