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