C: co lze očekávat
Ladislav Vaiz
spam na nagano.cz
Pondělí Srpen 29 13:27:56 CEST 2016
Pozor, v článku se řeší pointer, zde jen char.
Je ten char signed nebo unsigned? Podle toho se liší výsledek výrazu x + 1.
1 je int, takže se x převede na int a sečte s 1.
#include <stdio.h>
int main(){
char x = 0;
x--;
printf("%d\n", ((unsigned char)x) + 1); // 256
printf("%d\n", ((signed char)x) + 1); // 0
return 0;
}
L.
Jindroush napsal(a):
> Proste ukazovat pointerem mimo objekt a pak nad nim delat aritmetiku
> je nedefinovane chovani. Reseni neni rozcilovani, ale uprava kodu tak,
> aby dochazelo jen k definovanemu chovani.
> J.
>
> On 29.8.2016 12:53, Miroslav Draxal wrote:
>>
>> 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 by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>
>
>
> --
> Jindroush <jindroush na seznam.cz>
> ------------------------------------------------------------------------
>
> _______________________________________________
> 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