c:

Jan Waclawek konfera na efton.sk
Neděle Červenec 9 11:42:55 CEST 2017


No ale to by mal potom hlasit presne taku istu chybu aj na

volatile unsigned char x = 0xff;

pretoze konstanta ma typ signed int (len kebyze nevojde do signed int sa
zvazi v pripade hexadecimalnej konstanty unsigned int atd.) - vid C99
6.4.4.1#5; to iste je zopakovane v uz citovanej kapitole 5.4.6.1 manualu
manualu prekladaca XC8.

No a praveze u konstantnych vyrazov tieto maju byt vyhodnotene pocas
prekladu, tj. nie runtime. Podla C99 6.5.16 sa priradenie vykona tak, ze
sa *hodnota* praveho operandu, t.j. vyrazu napravo od =, skonvertuje na
typ laveho operandu; no a pocas prekladu je zname, ze vysledok vyrazu je
*hodnota*, ktora sa zmesti do cieloveho typu, takze podla pravidiel
konverzie (C99 6.3.1.3, tu plati #1) nie je ziadny dovod na ziadne
varovanie. Samozrejme, prekladac si moze varovat na co len chce, ale v
tomto pripade je to varovanie vadne.

Podla mna sa tu jedna o ten zriedkavy pripad (nefatalnej) chyby prekladaca,
a je to dovod oslovit vyrobcu (co nebudem robit ja, lebo ten XC8
nepouzivam ba dokonca ani nemam nainstalovany).

wek




----- Original Message ---------------
>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
>>



Další informace o konferenci Hw-list