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