c:

Miroslav Draxal evik na volny.cz
Neděle Červenec 9 11:26:38 CEST 2017


Je to divné pravidlo, ale budiž. 
    volatile signed int Z = 0x0111 ;
    volatile unsigned char x = (unsigned char) Z; // OK
    volatile unsigned char y = (unsigned char) 0x0111; // varování.

Začíná mi být jasné, proč tomu tak je, ale zdá se mi to tak trochu proti
sobě.
Chápu to tak, že i když u y přetypuji signed int na unsigned char, tak tento
výsledek se stejně při přiřazení bere jako signed int. 
Ovšem nerozumím tomuto.
Pokud 
volatile unsigned char y = 0x11; // ok
tak se podle toho co jsem psal přiřazuje 0x0011 a je to ok.
Pak u
volatile unsigned char y = (unsigned char) 0x0111; // varování.
Se nejprve převede 0x0111 na 0x11
A následně se při přiřazení převede na signed int 0x0011
Podle mého by to mělo projít.
Kde je v mé úvaze chyba?
Míra

-----Original Message-----
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Josef Štengl
Sent: Sunday, July 09, 2017 10:51 AM
To: HW-news
Subject: Re: c:

A jak to ten kompilátor má vědět? Není to žádná umělá inteligence, jen
soubor pravidel.
Pro kompilátor je to přiřazení známé konstanty signed int do unsigned char.
Další operace je logická operace a nemění typ výrazu.

Mimochodem, původně jsem si podle čísla myslel, že char je 16 bit, pak mi
došlo že by to ale nehlásilo to varování :-)

Řešení bych viděl potlačit na daném řádku varování kompilátoru například
pomocí pragmy kompilátoru (pak ho zase nezapomenou povolit). S příslušným
vysvětlujícím komentářem proč dávám do 8 bitové unsigned proměnné 16 bit
signed číslo.


Dne 8.7.2017 v 21:50 Jan Waclawek napsal(a):
>> volatile unsigned char x = 0x0111 & 0xff;
>> stále
>> warning: (751) arithmetic overflow in constant expression
>>
>
> Hm.
>
> Nerozumiem preco. Podla 5.4.6.1 manualu by operandy mali mat typ int (t.j.
> 16-bit znamienkovy), lebo sa do neho zmestia, takze nema co pretiect pri
> usual arithmetic conversions. V bitwise AND by nemalo mat co pretiect.
>
> Nepouzivate nejaky obskurny prepinac co meni sirku defaultnych typov (ak
> take XC8 vobec ma)?
>
> Je toto riadok v trivialnom programe typu
>
> int main(void) {
>   volatile unsigned char x = 0x0111 & 0xff;
> }
>
> ?
>
> wek
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.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