Re: C: co lze očekávat

Josef Štengl ok1ced na nagano.cz
Úterý Srpen 30 11:43:32 CEST 2016


Ano, to by mohlo pomoci.

Neznám danou architekturu ale pokud je to load store architektura a umožňuje adresování pomocí registru, tak to 
implementuje kompilátor. Jestli nejdříve inkrementuje x jako unsigned char a přičte (nebo dá jako offset) k adrese, nebo 
přičte k adrese (adresa bývá větší než byte) a jako offset dá jedna? Podle mě by bylo obojí správně a záleží jen na 
kompilátoru, jak se rozhodne. Ale každý dá jiný výsledek ...

V případě s '& 0xFF' vždy musí dojít k limitaci.

Mohl bych vás (tedy původního autora vlákna) požádat o výpis jak se to přeložilo? Mohlo by být jasněji.

Dne 29.8.2016 v 13:27 Hynek Sladky napsal(a):
> Cekal bych, ze se x+1 vyhodnoti jako int.
> Pro spravne chovani bych to obalil bitovym maskovanim:
> arrayA[(x+1)&0xFF]
>
> Hynek Sladky
>
>
> Dne 29.8.2016 12:53, Miroslav Draxal napsal(a):
>>
>> Je to hodně zjednodušené, to x se používá v programu. Nějak nerozumím tomu, že si kompilátátor může dělat co chce. Je to
>> char, obsahuje hodnotu 0xff, po odečtení musí přetéct do nuly.
>>
>> *From:*Hw-list [mailto:hw-list-bounces na list.hw.cz] *On Behalf Of *Jindroush
>> *Sent:* Monday, August 29, 2016 12:35 PM
>> *To:* HW-news
>> *Subject:* Re: C: co lze očekávat
>>
>> Asi prijdu s Wekem po funuse, ale obecne je to x-- undefined behaviour a kompilator muze delat, co chce ;-)
>>
>> http://stackoverflow.com/questions/18186987/decrementing-a-pointer-out-of-bounds-incrementing-it-into-bounds i s odkazy
>> na c99
>>
>> On 29.8.2016 12:22, Miroslav Draxal wrote:
>>
>>     Dobrý den,
>>
>>     Minulý týden jsem zde dával report o pnou předpokládané chybě c XC8. Nějak v tom tápe i Michrochip. Mám dojem, že na
>>     tam mají zaměstnaného studenta, který filtruje zprávy. Jednou píše že je to OK, jednou že je to chyba. Co na to
>>     zdejší odborníci na C. O co jde.
>>
>>     Mějme následující kód.
>>
>>     char arrayA[3]@0x123;
>>
>>     char x;
>>
>>     x = 0;
>>
>>         x--; // x=0xff
>>
>>         if ( arrayA[x + 1]) {……..}
>>
>>     z jaké adresy má brát if prvek z pole array? Jedná se mi o ten konstrukt x+1. X je char, čili přeteče na 0x00. Má
>>     ukazovat na  0x123 nebo má brát konstrukt arrayA[x + 1]) přetečení a ukazovat na 0x223?
>>
>>     U XC8 to teď to je tak, že pokud je array uloženo na 0x023 tak toto ukazuje na adresu 0x023 a pokud je array uloženo
>>     na 0x123 tak to ukazuje na adresu 0x223.
>>
>>     Jak to tedy je?
>>
>>
>>
>> --
>> Jindroush<jindroush na seznam.cz> <mailto:jindroush na seznam.cz>
>>
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored bywww.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>
>
> _______________________________________________
> 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